OSDN Git Service

Update Dutch.po (#842)
[winmerge-jp/winmerge-jp.git] / Src / IListCtrlImpl.h
1 #pragma once\r
2 \r
3 #include "IListCtrl.h"\r
4 #include <commctrl.h>\r
5 #include <atlimage.h>\r
6 \r
7 class IListCtrlImpl : public IListCtrl\r
8 {\r
9 public:\r
10         explicit IListCtrlImpl(HWND hwndListCtrl) : m_hwndListCtrl(hwndListCtrl)\r
11         {\r
12         }\r
13 \r
14         ~IListCtrlImpl() override {}\r
15 \r
16         int GetColumnCount() const override\r
17         {\r
18                 return Header_GetItemCount(ListView_GetHeader(m_hwndListCtrl));\r
19         }\r
20 \r
21         int GetRowCount() const override\r
22         {\r
23                 return ListView_GetItemCount(m_hwndListCtrl);\r
24         }\r
25 \r
26         String GetColumnName(int col) const override\r
27         {\r
28                 LVCOLUMN lvc;\r
29                 TCHAR columnName[256]; // Assuming max col header will never be > 256\r
30                 lvc.mask = LVCF_TEXT;\r
31                 lvc.pszText = &columnName[0];\r
32                 lvc.cchTextMax = sizeof(columnName) / sizeof(TCHAR);\r
33                 ListView_GetColumn(m_hwndListCtrl, col, &lvc);\r
34                 return lvc.pszText;\r
35         }\r
36 \r
37         String GetItemText(int row, int col) const override\r
38         {\r
39                 TCHAR text[512]; // Assuming max col header will never be > 512\r
40                 text[0] = '\0';\r
41                 ListView_GetItemText(m_hwndListCtrl, row, col, text, sizeof(text)/sizeof(text[0]));\r
42                 return text;\r
43         }\r
44 \r
45         void *GetItemData(int row) const override\r
46         {\r
47                 LVITEM lvi = {0};\r
48                 lvi.iItem = row;\r
49                 lvi.mask = LVIF_PARAM;\r
50                 ::SendMessage(m_hwndListCtrl, LVM_GETITEM, 0, (LPARAM)&lvi);\r
51                 return (void *)lvi.lParam;\r
52         }\r
53 \r
54         int GetTextColor(int row) const override\r
55         {\r
56                 NMLVCUSTOMDRAW nmlvcd = {0};\r
57                 nmlvcd.nmcd.hdr.code = NM_CUSTOMDRAW;\r
58                 nmlvcd.nmcd.hdr.idFrom = GetDlgCtrlID(m_hwndListCtrl);\r
59                 nmlvcd.nmcd.hdr.hwndFrom = m_hwndListCtrl;\r
60                 nmlvcd.nmcd.dwDrawStage = CDDS_ITEMPREPAINT | CDDS_SUBITEM;\r
61                 nmlvcd.nmcd.dwItemSpec = row;\r
62                 SendMessage(GetParent(m_hwndListCtrl), WM_NOTIFY, (WPARAM)m_hwndListCtrl, (LPARAM)&nmlvcd);\r
63                 return nmlvcd.clrText;\r
64         }\r
65 \r
66         int GetBackColor(int row) const override\r
67         {\r
68                 NMLVCUSTOMDRAW nmlvcd = {0};\r
69                 nmlvcd.nmcd.hdr.code = NM_CUSTOMDRAW;\r
70                 nmlvcd.nmcd.hdr.idFrom = GetDlgCtrlID(m_hwndListCtrl);\r
71                 nmlvcd.nmcd.hdr.hwndFrom = m_hwndListCtrl;\r
72                 nmlvcd.nmcd.dwDrawStage = CDDS_ITEMPREPAINT | CDDS_SUBITEM;\r
73                 nmlvcd.nmcd.dwItemSpec = row;\r
74                 SendMessage(GetParent(m_hwndListCtrl), WM_NOTIFY, (WPARAM)m_hwndListCtrl, (LPARAM)&nmlvcd);\r
75                 return nmlvcd.clrTextBk;\r
76         }\r
77 \r
78         bool IsSelectedItem(int sel) const override\r
79         {\r
80                 return !!ListView_GetItemState(m_hwndListCtrl, sel, LVIS_SELECTED);\r
81         }\r
82 \r
83         int GetNextItem(int sel, bool selected = false, bool reverse = false) const override\r
84         {\r
85                 return ListView_GetNextItem(m_hwndListCtrl, sel, (selected ? LVNI_SELECTED : 0) | (reverse ? LVNI_ABOVE : 0));          \r
86         }\r
87 \r
88         int GetNextSelectedItem(int sel, bool reverse = false) const override\r
89         {\r
90                 return ListView_GetNextItem(m_hwndListCtrl, sel, LVNI_SELECTED | (reverse ? LVNI_ABOVE : 0));           \r
91         }\r
92 \r
93         unsigned GetSelectedCount() const override\r
94         {\r
95                 return ListView_GetSelectedCount(m_hwndListCtrl);\r
96         }\r
97 \r
98         int GetIndent(int row) const override\r
99         {\r
100                 LVITEM item = {0};\r
101                 item.mask = LVIF_INDENT;\r
102                 item.iItem = row;\r
103                 ListView_GetItem(m_hwndListCtrl, &item);\r
104                 return item.iIndent;\r
105         }\r
106 \r
107         int GetIconIndex(int row) const override\r
108         {\r
109                 LVITEM item = {0};\r
110                 item.mask = LVIF_IMAGE;\r
111                 item.iItem = row;\r
112                 ListView_GetItem(m_hwndListCtrl, &item);\r
113                 return item.iImage;\r
114         }\r
115 \r
116         int GetIconCount() const override\r
117         {\r
118                 HIMAGELIST hImageList = ListView_GetImageList(m_hwndListCtrl, LVSIL_SMALL);\r
119                 return ImageList_GetImageCount(hImageList);\r
120         }\r
121 \r
122         std::string GetIconPNGData(int iconIndex) const override\r
123         {\r
124                 HIMAGELIST hImageList = ListView_GetImageList(m_hwndListCtrl, LVSIL_SMALL);\r
125                 IMAGEINFO imageInfo;\r
126                 std::string ret;\r
127                 if (ImageList_GetImageInfo(hImageList, iconIndex, &imageInfo))\r
128                 {\r
129                         HDC hdcMem = CreateCompatibleDC(nullptr);\r
130                         BITMAPINFO bmpinfo = { 0 };\r
131                         bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);\r
132                         int w = imageInfo.rcImage.right - imageInfo.rcImage.left;\r
133                         int h = imageInfo.rcImage.bottom - imageInfo.rcImage.top;\r
134                         void *pBits;\r
135                         bmpinfo.bmiHeader.biWidth = w;\r
136                         bmpinfo.bmiHeader.biHeight = h;\r
137                         bmpinfo.bmiHeader.biPlanes = 1;\r
138                         bmpinfo.bmiHeader.biBitCount = 32;\r
139                         bmpinfo.bmiHeader.biCompression = BI_RGB;\r
140                         HBITMAP hbmpImage = CreateDIBSection(nullptr, &bmpinfo, DIB_RGB_COLORS, &pBits, nullptr, 0);\r
141                         if (hbmpImage != nullptr)\r
142                         {\r
143                                 HBITMAP hbmpOld = (HBITMAP)SelectObject(hdcMem, hbmpImage);\r
144                                 ImageList_Draw(hImageList, iconIndex, hdcMem, 0, 0, ILD_TRANSPARENT);\r
145                                 CImage image;\r
146                                 image.Attach(hbmpImage);\r
147                                 image.SetHasAlphaChannel(true);\r
148                                 IStream *pStream = nullptr;\r
149                                 if (SUCCEEDED(CreateStreamOnHGlobal(nullptr, TRUE, &pStream)))\r
150                                 {\r
151                                         image.Save(pStream, Gdiplus::ImageFormatPNG);\r
152                                         STATSTG stat;\r
153                                         if (SUCCEEDED(pStream->Stat(&stat, STATFLAG_NONAME)))\r
154                                         {\r
155                                                 LARGE_INTEGER li = { 0 };\r
156                                                 ret.resize(stat.cbSize.LowPart, 0);\r
157                                                 pStream->Seek(li, STREAM_SEEK_SET, nullptr);\r
158                                                 pStream->Read(&ret[0], stat.cbSize.LowPart, nullptr);\r
159                                         }\r
160                                         pStream->Release();\r
161                                 }\r
162                                 SelectObject(hdcMem, hbmpOld);\r
163                                 DeleteObject(hdcMem);\r
164                                 DeleteObject(hbmpImage);\r
165                         }\r
166                 }\r
167                 return ret;\r
168         }\r
169 \r
170 protected:\r
171         HWND m_hwndListCtrl;\r
172 };\r