blob: ab43cbd56a184d760631b91bffc76a79cca3385a [file] [log] [blame]
Dennis Syrovatskyf3c57662005-11-02 03:53:04 +00001/* Copyright (C) 2005 TightVNC Team. All Rights Reserved.
2*
3* This is free software; you can redistribute it and/or modify
4* it under the terms of the GNU General Public License as published by
5* the Free Software Foundation; either version 2 of the License, or
6* (at your option) any later version.
7*
8* This software is distributed in the hope that it will be useful,
9* but WITHOUT ANY WARRANTY; without even the implied warranty of
10* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11* GNU General Public License for more details.
12*
13* You should have received a copy of the GNU General Public License
14* along with this software; if not, write to the Free Software
15* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
16* USA.
17*
18* TightVNC distribution homepage on the Web: http://www.tightvnc.com/
19*
20*/
21
22// -=- FTListView.cxx
23
24#include <vncviewer/FTListView.h>
25
26using namespace rfb;
27using namespace rfb::win32;
28
Dennis Syrovatsky8a19ce42005-11-07 08:46:23 +000029FTListView::FTListView(HWND hListView)
Dennis Syrovatskyf3c57662005-11-02 03:53:04 +000030{
Dennis Syrovatsky8a19ce42005-11-07 08:46:23 +000031 m_bInitialized = false;
32 m_hListView = hListView;
Dennis Syrovatskyf3c57662005-11-02 03:53:04 +000033 m_fileInfo.free();
34}
35
36FTListView::~FTListView()
37{
38 m_fileInfo.free();
39}
40
41
42bool
Dennis Syrovatsky8a19ce42005-11-07 08:46:23 +000043FTListView::initialize(HINSTANCE hInst)
Dennis Syrovatskyf3c57662005-11-02 03:53:04 +000044{
Dennis Syrovatsky8a19ce42005-11-07 08:46:23 +000045 if (m_bInitialized) return false;
46
47 initImageList(hInst);
48
49 RECT Rect;
50 GetClientRect(m_hListView, &Rect);
51 Rect.right -= GetSystemMetrics(SM_CXHSCROLL);
52 int xwidth0 = (int) (0.35 * Rect.right);
53 int xwidth1 = (int) (0.22 * Rect.right);
54 int xwidth2 = (int) (0.43 * Rect.right);
55
56 addColumn("Name", 0, xwidth0, LVCFMT_LEFT);
57 addColumn("Size", 1, xwidth1, LVCFMT_RIGHT);
58 addColumn("Data", 2, xwidth2, LVCFMT_LEFT);
Dennis Syrovatsky6c6786d2005-11-07 09:17:38 +000059
60 ListView_SetExtendedListViewStyleEx(m_hListView, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
61
Dennis Syrovatsky8a19ce42005-11-07 08:46:23 +000062 return true;
Dennis Syrovatskyf3c57662005-11-02 03:53:04 +000063}
64
65void
66FTListView::onGetDispInfo(NMLVDISPINFO *pDI)
67{
68 if (m_fileInfo.getFlagsAt(pDI->item.iItem) & FT_ATTR_DIR) {
69 pDI->item.iImage = 0;
70 } else {
71 pDI->item.iImage = 1;
72 }
73
74 switch (pDI->item.iSubItem)
75 {
76 case 0:
77 pDI->item.pszText = m_fileInfo.getNameAt(pDI->item.iItem);
78 break;
79 case 1:
80 {
81 unsigned int flags = m_fileInfo.getFlagsAt(pDI->item.iItem);
82 switch(flags & 0x000000FF)
83 {
84 case FT_ATTR_FILE:
85 {
86 char buf[32];
87 unsigned int size = m_fileInfo.getSizeAt(pDI->item.iItem);
88 sprintf(buf, "%u", size);
89 pDI->item.pszText = buf;
90 }
91 break;
92 case FT_ATTR_DIR:
93 pDI->item.pszText = "";
94 break;
95 default:
96 pDI->item.pszText = "Unspecified";
97 }
98 }
99 break;
100 case 2:
101 {
102 unsigned int data = m_fileInfo.getDataAt(pDI->item.iItem);
103 if (data == 0) {
104 pDI->item.pszText = "Unspecified";
105 } else {
106 FILETIME ft;
107 FolderManager fm;
108 fm.getFiletime(data, &ft);
109
110 SYSTEMTIME st;
111 FileTimeToSystemTime(&ft, &st);
112
113 char pDateTimeStr[1024];
114 char timeFmt[128];
115 GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_STIMEFORMAT, timeFmt, 128);
116 char dateFmt[128];
117 GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SSHORTDATE, dateFmt, 128);
118
119 char timeStr[128];
120 GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, timeFmt, timeStr, 128);
121 char dateStr[128];
122 GetDateFormat(LOCALE_USER_DEFAULT, 0, &st, dateFmt, dateStr, 128);
123
124 sprintf(pDateTimeStr, "%s %s", dateStr, timeStr);
125 pDI->item.pszText = pDateTimeStr;
126 }
127 }
128 break;
129 default:
130 break;
131 }
132}
133
134void
135FTListView::addItems(FileInfo *pFI)
136{
137 m_fileInfo.add(pFI);
138 LVITEM LVItem;
139 LVItem.mask = LVIF_TEXT | LVIF_STATE | LVIF_IMAGE;
140 LVItem.state = 0;
141 LVItem.stateMask = 0;
142 for (unsigned int i = 0; i < m_fileInfo.getNumEntries(); i++) {
143 LVItem.iItem = i;
144 LVItem.iSubItem = 0;
145 LVItem.iImage = I_IMAGECALLBACK;
146 LVItem.pszText = LPSTR_TEXTCALLBACK;
147 ListView_InsertItem(m_hListView, &LVItem);
148 }
149}
150
151void
152FTListView::deleteAllItems()
153{
154 ListView_DeleteAllItems(m_hListView);
155 m_fileInfo.free();
156}
157
158char *
159FTListView::getActivateItemName(LPNMITEMACTIVATE lpnmia)
160{
161 return m_fileInfo.getNameAt(lpnmia->iItem);
162}
163
164int
165FTListView::getSelectedItems(FileInfo *pFI)
166{
167 int selCount = ListView_GetSelectedCount(m_hListView);
168 int selItem = ListView_GetSelectionMark(m_hListView);
169 if ((selCount < 1) || (selItem < 0)) return -1;
170
171 selItem = -1;
172 selItem = ListView_GetNextItem(m_hListView, selItem, LVNI_SELECTED);
173 do {
174 pFI->add(m_fileInfo.getFullDataAt(selItem));
175 selItem = ListView_GetNextItem(m_hListView, selItem, LVNI_SELECTED);
176 } while (selItem >= 0);
177
178 return selCount;
179}
180
181void
182FTListView::initImageList(HINSTANCE hInst)
183{
184 m_hImageList = ImageList_Create(16, 16, ILC_MASK, 2, 2);
185
186 HICON hiconItem = LoadIcon(hInst, MAKEINTRESOURCE(IDI_FTDIR));
187 ImageList_AddIcon(m_hImageList, hiconItem);
188 DestroyIcon(hiconItem);
189
190 hiconItem = LoadIcon(hInst, MAKEINTRESOURCE(IDI_FTFILE));
191 ImageList_AddIcon(m_hImageList, hiconItem);
192 DestroyIcon(hiconItem);
193
194 ListView_SetImageList(m_hListView, m_hImageList, LVSIL_SMALL);
195}
Dennis Syrovatsky8a19ce42005-11-07 08:46:23 +0000196
197void
198FTListView::addColumn(char *iText, int iOrder, int xWidth, int alignFmt)
199{
200 LVCOLUMN lvc;
201 lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM | LVCF_ORDER;
202 lvc.fmt = alignFmt;
203 lvc.iSubItem = iOrder;
204 lvc.pszText = iText;
205 lvc.cchTextMax = 32;
206 lvc.cx = xWidth;
207 lvc.iOrder = iOrder;
208 ListView_InsertColumn(m_hListView, iOrder, &lvc);
209}