OSDN Git Service

datファイルのD&Dで、ファイル名チェックで、ファイルパスまで送っていたので、
[gikonavigoeson/gikonavi.git] / ListViewUtils.pas
index b5f14c5..59612e8 100644 (file)
@@ -10,6 +10,7 @@ type
        TListViewUtils = class(TObject)
        private
                {Private \90é\8c¾}
+
                class procedure DrawCategoryItem(BBS: TBBS; Item: TListItem; ListView: TListView);
                class procedure DrawBoardItem(Category: TCategory; Item: TListItem; ListView: TListView);
                class procedure DrawThreadItem(Board: TBoard; Item: TListItem; ListView: TListView);
@@ -19,22 +20,21 @@ type
                {Public \90é\8c¾}
                class procedure SetBoardTreeNode(inBBS : TBBS; treeView: TTreeView);
                class function SetCategoryListItem(ABBS2ch: TBBS; ListView: TListView;
-                       NumberVisible: Boolean; var vSortIndex: Integer; var vSortOrder: Boolean): Integer;
+                       NumberVisible: Boolean): Integer;
                class procedure ListViewSort(Sender: TObject; ListView: TListView; Column: TListColumn;
-                       NumberVisible: Boolean; var vSortOrder: Boolean;        var vSortIndex: Integer);
+                       NumberVisible: Boolean; vSortOrder: Boolean);
                class function  ActiveListTrueColumn( column : TListColumn ) : TListColumn;
                class function SetBoardListItem(Category: TCategory; ListView: TListView;
-                       NumberVisible: Boolean; var vSortIndex: Integer; var vSortOrder: Boolean): Integer;
+                       NumberVisible: Boolean): Integer;
                class function SetThreadListItem(Board: TBoard; ListView: TListView;
-                       NumberVisible: Boolean; var vSortIndex: Integer; var vSortOrder: Boolean): Integer;
+                       NumberVisible: Boolean): Integer;
                class procedure ListViewData(Sender: TObject; Item: TListItem);
        end;
 
-
 implementation
 
 uses
-       GikoSystem, Sort, Setting, Giko, MojuUtils, GikoDataModule;
+       GikoSystem, Sort, Setting, Giko, MojuUtils, GikoDataModule, DateUtils, Math;
 
 const
        //\83c\83\8a\81[\81E\83\8a\83X\83g\83A\83C\83R\83\93
@@ -80,9 +80,9 @@ begin
 
                // \83L\83\83\83r\83l\83b\83g\95\\8e¦\91O\82É\8dÄ\83\\81[\83g
                if ( GikoSys.Setting.BBSSortIndex <> 0 ) or ( GikoSys.Setting.BBSSortOrder <> true ) then begin
-                       Sort.SortOrder := true;
-                       Sort.SortIndex := 0;
-                       Sort.SortNoFlag := true;
+                       Sort.SetSortOrder(true);
+                       Sort.SetSortIndex(0);
+                       Sort.SetSortNoFlag(true);
                        inBBS.Sort(CategorySortProc);
                end;
 
@@ -99,9 +99,9 @@ begin
 
                        // \83L\83\83\83r\83l\83b\83g\95\\8e¦\91O\82É\8dÄ\83\\81[\83g
                        if ( GikoSys.Setting.CategorySortIndex <> 0 ) or ( GikoSys.Setting.CategorySortOrder <> true ) then begin
-                               Sort.SortOrder := true;
-                               Sort.SortIndex := 0;
-                               Sort.SortNoFlag := true;
+                               Sort.SetSortOrder(true);
+                               Sort.SetSortIndex(0);
+                               Sort.SetSortNoFlag(true);
                                Category.CustomSort(BoardSortProc);
                        end;
 
@@ -141,9 +141,7 @@ end;
 class function TListViewUtils.SetCategoryListItem(
        ABBS2ch: TBBS;
        ListView: TListView;
-       NumberVisible: Boolean;
-       var vSortIndex: Integer;
-       var vSortOrder: Boolean
+       NumberVisible: Boolean
 ): Integer;
 var
        TitleColumn     : TListColumn;
@@ -183,12 +181,13 @@ begin
                GikoForm.FolderImage.Picture := nil;
                GikoForm.ItemIcon16.GetBitmap(1, GikoForm.FolderImage.Picture.Bitmap);
 
-               vSortIndex := GikoSys.Setting.BBSSortIndex;
-               vSortOrder := GikoSys.Setting.BBSSortOrder;
                for i := ListView.Columns.Count - 1 downto 0 do begin
-                       idx := ListView.Column[ i ].Tag;
-                       if vSortIndex = Ord( GikoSys.Setting.BBSColumnOrder[ idx ] ) then
-                               ListViewSort( nil, ListView, ListView.Column[ i ], NumberVisible, vSortOrder, vSortIndex );
+                       if (GikoSys.Setting.BBSSortIndex
+                                       = Integer(GikoSys.Setting.BBSColumnOrder[ ListView.Column[ i ].Tag ])) then begin
+                               ListViewSort( nil, ListView, ListView.Column[ i ],
+                                        NumberVisible, GikoSys.Setting.BBSSortOrder);
+                               Break;
+                       end;
                end;
 
                Result := ABBS2ch.Count;
@@ -202,11 +201,10 @@ class procedure TListViewUtils.ListViewSort(
        ListView: TListView;
        Column: TListColumn;
        NumberVisible: Boolean;
-       var vSortOrder: Boolean;
-       var vSortIndex: Integer
+       vSortOrder: Boolean
 );
 var
-       i, id, idx      : Integer;
+       i, idx  : Integer;
        orderList               : TList;
        wkBBS: TBBS;
        wkCategory: TCategory;
@@ -217,53 +215,41 @@ begin
        for i := 0 to ListView.Columns.Count - 1 do begin
                ListView.Column[i].ImageIndex := -1;
        end;
-
-       if SortOrder then
+       if vSortOrder then
                ListView.Column[ idx ].ImageIndex := ITEM_ICON_SORT1
        else
                ListView.Column[ idx ].ImageIndex := ITEM_ICON_SORT2;
 
-       Sort.SortNoFlag := NumberVisible;
 
-       //if TObject(TreeView.Selected.Data) is TBBS then begin
+       Sort.SetSortNoFlag(NumberVisible);
+
        if TObject( GikoForm.ActiveList ) is TBBS then begin
-               //wkBBS := TBBS(TreeView.Selected.Data);
                wkBBS := TBBS( GikoForm.ActiveList );
                orderList := GikoSys.Setting.BBSColumnOrder;
-               id := Integer( orderList[ idx ] );
-               Sort.SortOrder := vSortOrder;
-               Sort.SortIndex := id;
-               GikoSys.Setting.BBSSortIndex := id;
-               GikoSys.Setting.BBSSortOrder := vSortOrder;
+               Sort.SetSortOrder(vSortOrder);
+               Sort.SetSortIndex(Integer( orderList[ idx ] ));
+               GikoSys.Setting.BBSSortIndex := Sort.GetSortIndex;
+               GikoSys.Setting.BBSSortOrder := Sort.GetSortOrder;
                wkBBS.Sort(Sort.CategorySortProc);
-       //end else if TObject(TreeView.Selected.Data) is TCategory then begin
        end else if TObject( GikoForm.ActiveList ) is TCategory then begin
-               //wkCategory := TCategory(TreeView.Selected.Data);
                wkCategory := TCategory( GikoForm.ActiveList );
                orderList := GikoSys.Setting.CategoryColumnOrder;
-               id := Integer( orderList[ idx ] );
-               Sort.SortOrder := vSortOrder;
-               Sort.SortIndex := id;
-               GikoSys.Setting.CategorySortIndex := id;
-               GikoSys.Setting.CategorySortOrder := vSortOrder;
+               Sort.SetSortOrder(vSortOrder);
+               Sort.SetSortIndex(Integer( orderList[ idx ] ));
+               GikoSys.Setting.CategorySortIndex := Sort.GetSortIndex;
+               GikoSys.Setting.CategorySortOrder := Sort.GetSortOrder;
                wkCategory.CustomSort(BoardSortProc);
-       //end else if TObject(TreeView.Selected.Data) is TBoard then begin
        end else if TObject( GikoForm.ActiveList ) is TBoard then begin
-               //wkBoard := TBoard(TreeView.Selected.Data);
                wkBoard := TBoard( GikoForm.ActiveList );
                orderList := GikoSys.Setting.BoardColumnOrder;
-               id := Integer( orderList[ idx ] );
-               Sort.SortOrder := vSortOrder;
-               Sort.SortIndex := id;
-               GikoSys.Setting.BoardSortIndex := id;
-               GikoSys.Setting.BoardSortOrder := vSortOrder;
+               Sort.SetSortOrder(vSortOrder);
+               Sort.SetSortIndex(Integer( orderList[ idx ] ));
+               GikoSys.Setting.BoardSortIndex := Sort.GetSortIndex;
+               GikoSys.Setting.BoardSortOrder := Sort.GetSortOrder;
                wkBoard.CustomSort(ThreadItemSortProc);
-       end else begin
-               id := 0;
        end;
 
        ListView.Refresh;
-       vSortIndex := id;
 end;
 
 {!
@@ -273,49 +259,16 @@ Delphi 6 Personal 
 \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
 }
 class function TListViewUtils.ActiveListTrueColumn( column : TListColumn ) : TListColumn;
-{*
-var
-       i, idx          : Integer;
-       orderList       : TList;
-*}
 begin
-
        // \90³\82µ\82­\95Ï\8a·\82·\82é\95û\96@\82ª\95ª\82©\82ç\82È\82¢\82Ì\82Å\95Û\97¯
        Result := column;
        Exit;
-{*
-       Result := column;
-
-       if TObject( FActiveList ) is TBBS then
-               orderList := GikoSys.Setting.BBSColumnOrder
-       else if TObject( FActiveList ) is TCategory then
-               orderList := GikoSys.Setting.CategoryColumnOrder
-       else if TObject( FActiveList ) is TBoard then
-               orderList := GikoSys.Setting.BoardColumnOrder
-       else
-               Exit;
-
-       idx := column.Tag;
-
-       for i := 0 to ListView.Columns.Count - 1 do begin
-               if Integer( orderList[ ListView.Column[ i ].Tag ] ) = 0 then begin
-                       if idx = 0 then
-                               Result := ListView.Column[ i ]
-                       else if idx <= i then
-                               Result := ListView.Column[ idx - 1 ];
-                       Exit;
-               end;
-       end;
-*}
-
 end;
 //ListView\82ÉBoardItem\82ð\90Ý\92è\82·\82é
 class function TListViewUtils.SetBoardListItem(
        Category: TCategory;
        ListView: TListView;
-       NumberVisible: Boolean;
-       var vSortIndex: Integer;
-       var vSortOrder: Boolean
+       NumberVisible: Boolean
 ): Integer;
 var
        TitleColumn     : TListColumn;
@@ -370,12 +323,13 @@ begin
                GikoForm.FolderImage.Picture := nil;
                GikoForm.ItemIcon16.GetBitmap(3, GikoForm.FolderImage.Picture.Bitmap);
 
-               vSortIndex := GikoSys.Setting.CategorySortIndex;
-               vSortOrder := GikoSys.Setting.CategorySortOrder;
                for i := ListView.Columns.Count - 1 downto 0 do begin
-                       idx := ListView.Column[ i ].Tag;
-                       if vSortIndex = Ord( GikoSys.Setting.CategoryColumnOrder[ idx ] ) then
-                               ListViewSort( nil, ListView, ListView.Column[ i ], NumberVisible, vSortOrder, vSortIndex );
+                       if (GikoSys.Setting.CategorySortIndex =
+                               Integer( GikoSys.Setting.CategoryColumnOrder[ ListView.Columns[i].Tag ] )) then begin
+                               ListViewSort( nil, ListView, ListView.Column[ i ],
+                                        NumberVisible, GikoSys.Setting.CategorySortOrder);
+                               Break;
+                       end;
                end;
 
                Result := Category.Count;
@@ -387,9 +341,7 @@ end;
 class function TListViewUtils.SetThreadListItem(
        Board: TBoard;
        ListView: TListView;
-       NumberVisible: Boolean;
-       var vSortIndex: Integer;
-       var vSortOrder: Boolean
+       NumberVisible: Boolean
 ): Integer;
 var
        TitleColumn     : TListColumn;
@@ -453,6 +405,16 @@ begin
                                Board.NewThreadCount := Board.GetNewThreadCount;
                                ListView.Items.Count := Board.NewThreadCount;
                        end;
+                       gvtArch:
+                       begin
+                               Board.ArchiveThreadCount := Board.GetArchiveThreadCount;
+                               ListView.Items.Count := Board.ArchiveThreadCount;
+                       end;
+                       gvtLive:
+                       begin
+                               Board.LiveThreadCount := Board.GetLiveThreadCount;
+                               ListView.Items.Count := Board.LiveThreadCount;
+                       end;
                        gvtUser:
                        begin
                                Board.UserThreadCount:= Board.GetUserThreadCount;
@@ -464,12 +426,13 @@ begin
                GikoForm.FolderImage.Picture := nil;
                GikoForm.ItemIcon16.GetBitmap(5, GikoForm.FolderImage.Picture.Bitmap);
 
-               vSortIndex := GikoSys.Setting.BoardSortIndex;
-               vSortOrder := GikoSys.Setting.BoardSortOrder;
                for i := ListView.Columns.Count - 1 downto 0 do begin
-                       idx := ListView.Column[ i ].Tag;
-                       if vSortIndex = Ord( GikoSys.Setting.BoardColumnOrder[ idx ] ) then
-                               ListViewSort( nil, ListView, ListView.Column[ i ], NumberVisible, vSortOrder, vSortIndex );
+                       if (GikoSys.Setting.BoardSortIndex
+                               = Integer( GikoSys.Setting.BoardColumnOrder[ ListView.Columns[ i ].Tag ] )) then begin
+                               ListViewSort( nil, ListView, ListView.Column[ i ],
+                                        NumberVisible, GikoSys.Setting.BoardSortOrder);
+                               Break;
+                       end;
                end;
 
                Result := Board.Count;
@@ -602,12 +565,14 @@ begin
                gvtAll: BoardCnt := Board.Count;
                gvtLog: BoardCnt := Board.LogThreadCount;
                gvtNew: BoardCnt := Board.NewThreadCount;
+               gvtArch: BoardCnt := Board.ArchiveThreadCount;
+               gvtLive: BoardCnt := Board.LiveThreadCount;
                gvtUser: BoardCnt := Board.UserThreadCount;
                else
                        BoardCnt := 0;
        end;
 
-       if (BoardCnt <= 0) or (Item = nil) or (Item.Index > BoardCnt)
+       if (BoardCnt <= 0) or (Item = nil) or (Item.Index >= BoardCnt)
                or (ListView.Items.Count = 0) or (not (Board.Items[Item.Index] is TThreadItem)) then Exit;
 
        //\89ü\91P\82·\82×\82«\83u\83\8d\83b\83N/////////////////////////////////////////////////////
@@ -617,6 +582,8 @@ begin
                                                        ThreadItem := TThreadItem(Board.Items[Item.Index]);
                gvtLog:         ThreadItem := Board.GetLogThread(Item.Index);
                gvtNew:         ThreadItem := Board.GetNewThread(Item.Index);
+               gvtArch:    ThreadItem := Board.GetArchiveThread(Item.Index);
+               gvtLive:    ThreadItem := Board.GetLiveThread(Item.Index);
                gvtUser:        ThreadItem := Board.GetUserThread(Item.Index);
        end;
        //////////////////////////////////////////////////////////////////////////
@@ -645,6 +612,7 @@ begin
                gasNew: Item.StateIndex := 0;
                gasAge: Item.StateIndex := 1;
                gasSage: Item.StateIndex := 2;
+               gasArch: Item.StateIndex := 3;
        end;
 
        if ThreadItem.IsLogFile then begin
@@ -659,6 +627,7 @@ end;
 class procedure TListViewUtils.DrawItemLogThread(Thread: TThreadItem; Item: TListItem; ColumnCount: Integer);
 var
        i, idx : Integer;
+       spanday: Double;
 begin
        idx := 0;
        for i := 0 to ColumnCount - 1 do begin
@@ -702,6 +671,23 @@ begin
                                Item.SubItems[ idx ] := '';
                        end else
                                Item.SubItems[ idx ] := FormatDateTime('yyyy/mm/dd hh:mm:ss', Thread.LastModified);
+               gbcVigor:
+                       begin
+                               if (Thread.CreateDate <> ZERO_DATE)  then begin
+                                       if (Thread.AgeSage <> gasArch) then begin
+                                               spanday := DaySpan(Sort.GetSortDate, Thread.CreateDate);
+                                       end else begin
+                                               spanday := DaySpan(Thread.LastModified, Thread.CreateDate);
+                                       end;
+                                       if (spanday > 0) then begin
+                                               Item.SubItems[ idx ] := Format('%f', [Thread.AllResCount / spanday]);
+                                       end else begin
+                                               Item.SubItems[ idx ] := '';
+                                       end;
+                               end else begin
+                                       Item.SubItems[ idx ] := '';
+                               end;
+                       end;
                end;
                Inc( idx );
        end;
@@ -715,6 +701,7 @@ end;
 class procedure TListViewUtils.DrawItemNoLogThread(Thread: TThreadItem; Item: TListItem; ColumnCount: Integer);
 var
        i, idx: Integer;
+       spanday: Double;
 begin
        idx := 0;
        for i := 0 to ColumnCount - 1do begin
@@ -733,9 +720,28 @@ begin
                                Item.SubItems[ idx ] := FormatDateTime('yyyy/mm/dd hh:mm:ss', Thread.CreateDate);
                gbcLastModified:
                        Item.SubItems[ idx ] := '';
+               gbcVigor:
+                       begin
+                               if (Thread.CreateDate <> ZERO_DATE)  then begin
+                                       if (Thread.AgeSage <> gasArch) then begin
+                                               spanday := DaySpan(Sort.GetSortDate, Thread.CreateDate);
+                                       end else begin
+                                               spanday := DaySpan(Thread.LastModified, Thread.CreateDate);
+                                       end;
+
+                                       if (spanday > 0) then begin
+                                               Item.SubItems[ idx ] := Format('%f', [Thread.AllResCount / spanday]);
+                                       end else begin
+                                               Item.SubItems[ idx ] := '';
+                                       end;
+                               end else begin
+                                       Item.SubItems[ idx ] := '';
+                               end;
+                       end;
                else
                        Item.SubItems[ idx ] := '';
                end;
+
                Inc( idx );
        end;
        if Thread.NewArrival then