OSDN Git Service

C++11のauto, nullptrを導入。
[tpi/lychee.git] / src / lychee / cls_listctrl.cpp
1 /*******************************************************************************\r
2   TPI - flexible but useless plug-in framework.\r
3   Copyright (C) 2002-2009 Silky\r
4 \r
5   This library is free software; you can redistribute it and/or modify it under\r
6   the terms of the GNU Lesser General Public License as published by the Free\r
7   Software Foundation; either version 2.1 of the License, or (at your option)\r
8   any later version.\r
9 \r
10   This library is distributed in the hope that it will be useful, but WITHOUT\r
11   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or \r
12   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License\r
13   for more details.\r
14 \r
15   You should have received a copy of the GNU Lesser General Public License along\r
16   with this library; if not, write to the Free Software Foundation, Inc.,\r
17   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r
18 \r
19   $Id$\r
20 *******************************************************************************/\r
21 \r
22 #include "lychee.h"\r
23 \r
24 #include "cls_listctrl.h"\r
25 #include "dlg_make.h"\r
26 #include "frm_main.h"\r
27 #include "functions.h"\r
28 \r
29 //******************************************************************************\r
30 // myListCtrl\r
31 //******************************************************************************\r
32 \r
33 IMPLEMENT_DYNAMIC_CLASS(myListCtrl, wxListView)\r
34 \r
35 //******************************************************************************\r
36 // Event Table.\r
37 //******************************************************************************\r
38 \r
39 BEGIN_EVENT_TABLE(myListCtrl, wxListView)\r
40         // ListView\r
41         EVT_LIST_COL_CLICK(XRCID("ListView"), myListCtrl::OnColClick)\r
42 END_EVENT_TABLE()\r
43 \r
44 //******************************************************************************\r
45 // Event handler.\r
46 //******************************************************************************\r
47 \r
48 wxString myListCtrl::OnGetItemText(long i, long column) const\r
49 {\r
50         // リストビューに項目を追加。\r
51         TPI_FILEINFO * fi = (TPI_FILEINFO *) this->apShowFile[i];\r
52         switch (column)\r
53         {\r
54         case 0:\r
55                 return fi->fnFileName.GetFullName();\r
56         case 1:\r
57                 return wxString::Format(wxString("%" wxLongLongFmtSpec "u"), fi->nUnpackedSize);\r
58         case 2:\r
59                 return wxString::Format(wxString("%" wxLongLongFmtSpec "u"), fi->nPackedSize);\r
60         case 3:\r
61                 return wxString::Format(wxT("%3.1f%%"), fi->wCompressRatio / 10.0);\r
62         case 4:\r
63                 return fi->szMethod;\r
64         case 5:\r
65         {\r
66 #ifdef __WINDOWS__\r
67                 wxString szTemp = wxT("---w-");\r
68                 szTemp[0] = fi->dwAttribute & TPI_ATTRIBUTE_DIRECTORY ? wxT('d') :\r
69                             fi->dwAttribute & TPI_ATTRIBUTE_ARCHIVE   ? wxT('a') : wxT('-');\r
70                 szTemp[1] = fi->dwAttribute & TPI_ATTRIBUTE_SYSTEM    ? wxT('s') : wxT('-');\r
71                 szTemp[2] = fi->dwAttribute & TPI_ATTRIBUTE_HIDDEN    ? wxT('h') : wxT('-');\r
72                 szTemp[3] = fi->dwAttribute & TPI_ATTRIBUTE_READONLY  ? wxT('r') : wxT('w');\r
73                 szTemp[4] = fi->dwAttribute & TPI_ATTRIBUTE_ENCRYPTED ? wxT('g') : wxT('-');\r
74                 return szTemp;\r
75 #else\r
76                 return wxString::Format(wxT("%o"), fi->wPermission);\r
77 #endif\r
78         }\r
79         case 6:\r
80                 return fi->tmModify.Format(_("%Y/%m/%d %H:%M:%S"));\r
81         case 7:\r
82                 return fi->fnFileName.GetPath();\r
83         case 8:\r
84                 return GetFileTypeName(fi->fnFileName);\r
85         case 9:\r
86                 return wxString::Format(wxString("%" wxLongLongFmtSpec "u"), fi->nFileId);\r
87         case 10:\r
88                 return fi->szComment;\r
89         default:\r
90                 return wxEmptyString;\r
91         }\r
92 }\r
93 \r
94 int myListCtrl::OnGetItemImage(long i) const\r
95 {\r
96         wxIcon icon = GetFileTypeIcon(((TPI_FILEINFO *) this->apShowFile[i])->fnFileName);\r
97         g_hIconLL.Add(icon);\r
98         return g_hIconLS.Add(myRescaleIcon(icon));\r
99 }\r
100 \r
101 wxListItemAttr * myListCtrl::OnGetItemAttr(long i) const\r
102 {\r
103         TPI_FILEINFO * fi = (TPI_FILEINFO *) this->apShowFile[i];\r
104         return\r
105                 fi->eDanger                               ? (wxListItemAttr *) & this->atDangerItem :\r
106                 fi->dwAttribute & TPI_ATTRIBUTE_ENCRYPTED ? (wxListItemAttr *) & this->atEncryptedItem : nullptr;\r
107 }\r
108 \r
109 void myListCtrl::OnColClick(wxListEvent& e)\r
110 {\r
111         g_nSortColumn = e.GetColumn();\r
112         g_fSortAscend = ! (g_nSortColumn == e.GetColumn() && g_fSortAscend);\r
113 \r
114         // ソート。\r
115         size_t nCount = this->apShowFile.GetCount();\r
116         this->apShowFile.Sort(& ListCtrlCompareProc);\r
117         this->SetItemCount(nCount);\r
118         this->RefreshItems(0, nCount - 1);\r
119 }\r
120 \r
121 //******************************************************************************\r
122 //    諸処理関数\r
123 //******************************************************************************\r
124 \r
125 #define NumCmp(member) (item1->member < item2->member) ? -1 : ((item1->member > item2->member) ? 1 : 0)\r
126 \r
127 int ListCtrlCompareProc(void ** pItem1, void ** pItem2)\r
128 {\r
129         TPI_FILEINFO * item1 = (TPI_FILEINFO *) * pItem1, * item2 = (TPI_FILEINFO *) * pItem2;\r
130         return (g_fSortAscend ? 1 : -1) * (\r
131                 g_nSortColumn == 0 ? ::wxStricmp(item1->fnFileName.GetFullName(), item2->fnFileName.GetFullName()) : // Filename\r
132                 g_nSortColumn == 1 ? NumCmp(nUnpackedSize) : // Unpacked\r
133                 g_nSortColumn == 2 ? NumCmp(nPackedSize) : // Packed\r
134                 g_nSortColumn == 3 ? NumCmp(wCompressRatio) : // Ratio\r
135                 g_nSortColumn == 6 ? NumCmp(tmModify) : // Last modified\r
136                 g_nSortColumn == 7 ? ::wxStricmp(item1->fnFileName.GetPath(), item2->fnFileName.GetPath()) : // Path\r
137                 g_nSortColumn == 8 ? ::wxStricmp(GetFileTypeName(item1->fnFileName), GetFileTypeName(item2->fnFileName)) : // Type\r
138                 g_nSortColumn == 9 ? NumCmp(nFileId) : // No\r
139                 g_nSortColumn == 10? ::wxStricmp(item1->szComment, item2->szComment) : // Comment\r
140                 0);\r
141 }\r