Browse Source

Added FTListView class.

Code improvements.


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@365 3789f03b-4d11-0410-bbf8-ca57d06f2519
tags/v0.0.90
Dennis Syrovatsky 18 years ago
parent
commit
f3c5766d60
6 changed files with 329 additions and 84 deletions
  1. 2
    5
      rfb/DirManager.h
  2. 75
    75
      rfb_win32/FolderManager.cxx
  3. 4
    4
      rfb_win32/FolderManager.h
  4. 177
    0
      vncviewer/FTListView.cxx
  5. 63
    0
      vncviewer/FTListView.h
  6. 8
    0
      vncviewer/vncviewer.dsp

+ 2
- 5
rfb/DirManager.h View File

@@ -29,12 +29,9 @@
namespace rfb {
class DirManager {
public:
DirManager();
virtual ~DirManager();

virtual bool createDir(char *pFullPath);
virtual bool renameDir(char *pOldName, char *pNewName);
virtual bool deleteDir(char *pFullPath);
virtual bool renameIt(char *pOldName, char *pNewName);
virtual bool deleteIt(char *pFullPath);

virtual bool getDirInfo(char *pPath, FileInfo *pFileInfo, unsigned int dirOnly);
};

+ 75
- 75
rfb_win32/FolderManager.cxx View File

@@ -100,7 +100,7 @@ FolderManager::getFolderInfoWithPrefix(char *pPrefix, FileInfo *pFileInfo)
strcpy(prefix, pPrefix);

FileInfo tmpFileInfo;
if (!getFolderInfo(prefix, &tmpFileInfo, 0)) {
if (!getDirInfo(prefix, &tmpFileInfo, 0)) {
tmpFileInfo.free();
return false;
} else {
@@ -115,99 +115,99 @@ FolderManager::getFolderInfoWithPrefix(char *pPrefix, FileInfo *pFileInfo)
}
bool
FolderManager::getFolderInfo(char *pPath, FileInfo *pFileInfo, unsigned int dirOnly)
FolderManager::getDirInfo(char *pPath, FileInfo *pFileInfo, unsigned int dirOnly)
{
if (strlen(pPath) == 0) return getDrivesInfo(pFileInfo);
char path[FT_FILENAME_SIZE];
sprintf(path, "%s\\*", pPath);
WIN32_FIND_DATA FindFileData;
SetErrorMode(SEM_FAILCRITICALERRORS);
HANDLE handle = FindFirstFile(path, &FindFileData);
DWORD lastError = GetLastError();
SetErrorMode(0);
if (handle != INVALID_HANDLE_VALUE) {
do {
if (strcmp(FindFileData.cFileName, ".") != 0 &&
strcmp(FindFileData.cFileName, "..") != 0) {
unsigned int lastWriteTime = getTime70(FindFileData.ftLastWriteTime);
if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
pFileInfo->add(FindFileData.cFileName, 0, lastWriteTime, FT_ATTR_DIR);
} else {
if (!dirOnly)
pFileInfo->add(FindFileData.cFileName, FindFileData.nFileSizeLow, lastWriteTime, FT_ATTR_FILE);
}
}
} while (FindNextFile(handle, &FindFileData));
} else {
return false;
}
FindClose(handle);
return true;
if (strlen(pPath) == 0) return getDrivesInfo(pFileInfo);
char path[FT_FILENAME_SIZE];
sprintf(path, "%s\\*", pPath);
WIN32_FIND_DATA FindFileData;
SetErrorMode(SEM_FAILCRITICALERRORS);
HANDLE handle = FindFirstFile(path, &FindFileData);
DWORD lastError = GetLastError();
SetErrorMode(0);
if (handle != INVALID_HANDLE_VALUE) {
do {
if (strcmp(FindFileData.cFileName, ".") != 0 &&
strcmp(FindFileData.cFileName, "..") != 0) {
unsigned int lastWriteTime = getTime70(FindFileData.ftLastWriteTime);
if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
pFileInfo->add(FindFileData.cFileName, 0, lastWriteTime, FT_ATTR_DIR);
} else {
if (!dirOnly)
pFileInfo->add(FindFileData.cFileName, FindFileData.nFileSizeLow, lastWriteTime, FT_ATTR_FILE);
}
}
} while (FindNextFile(handle, &FindFileData));
} else {
return false;
}
FindClose(handle);
return true;
}

bool
FolderManager::getDrivesInfo(FileInfo *pFileInfo)
{
TCHAR szDrivesList[256];
if (GetLogicalDriveStrings(255, szDrivesList) == 0)
return false;
int i = 0;
while (szDrivesList[i] != '\0') {
char *drive = strdup(&szDrivesList[i]);
char *backslash = strrchr(drive, '\\');
if (backslash != NULL)
*backslash = '\0';
pFileInfo->add(drive, 0, 0, FT_ATTR_DIR);
free(drive);
i += strcspn(&szDrivesList[i], "\0") + 1;
}
return true;
TCHAR szDrivesList[256];
if (GetLogicalDriveStrings(255, szDrivesList) == 0)
return false;
int i = 0;
while (szDrivesList[i] != '\0') {
char *drive = strdup(&szDrivesList[i]);
char *backslash = strrchr(drive, '\\');
if (backslash != NULL)
*backslash = '\0';
pFileInfo->add(drive, 0, 0, FT_ATTR_DIR);
free(drive);
i += strcspn(&szDrivesList[i], "\0") + 1;
}
return true;
}

bool
FolderManager::getInfo(char *pFullPath, FILEINFO *pFIStruct)
{
WIN32_FIND_DATA FindFileData;
SetErrorMode(SEM_FAILCRITICALERRORS);
HANDLE hFile = FindFirstFile(pFullPath, &FindFileData);
DWORD lastError = GetLastError();
SetErrorMode(0);
if (hFile != INVALID_HANDLE_VALUE) {
FindClose(hFile);
strcpy(pFIStruct->name, FindFileData.cFileName);
pFIStruct->info.data = getTime70(FindFileData.ftLastWriteTime);
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
pFIStruct->info.size = 0;
pFIStruct->info.flags = FT_ATTR_DIR;
return true;
} else {
pFIStruct->info.size = FindFileData.nFileSizeLow;
pFIStruct->info.flags = FT_ATTR_FILE;
return true;
}
}
return false;
WIN32_FIND_DATA FindFileData;
SetErrorMode(SEM_FAILCRITICALERRORS);
HANDLE hFile = FindFirstFile(pFullPath, &FindFileData);
DWORD lastError = GetLastError();
SetErrorMode(0);
if (hFile != INVALID_HANDLE_VALUE) {
FindClose(hFile);
strcpy(pFIStruct->name, FindFileData.cFileName);
pFIStruct->info.data = getTime70(FindFileData.ftLastWriteTime);
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
pFIStruct->info.size = 0;
pFIStruct->info.flags = FT_ATTR_DIR;
return true;
} else {
pFIStruct->info.size = FindFileData.nFileSizeLow;
pFIStruct->info.flags = FT_ATTR_FILE;
return true;
}
}
return false;
}

unsigned int
FolderManager::getTime70(FILETIME ftime)
{
LARGE_INTEGER uli;
uli.LowPart = ftime.dwLowDateTime;
uli.HighPart = ftime.dwHighDateTime;
uli.QuadPart = (uli.QuadPart - 116444736000000000) / 10000000;
return uli.LowPart;
LARGE_INTEGER uli;
uli.LowPart = ftime.dwLowDateTime;
uli.HighPart = ftime.dwHighDateTime;
uli.QuadPart = (uli.QuadPart - 116444736000000000) / 10000000;
return uli.LowPart;
}

void
FolderManager::getFiletime(unsigned int time70, FILETIME *pftime)
{
LONGLONG ll = Int32x32To64(time70, 10000000) + 116444736000000000;
pftime->dwLowDateTime = (DWORD) ll;
pftime->dwHighDateTime = (DWORD) (ll >> 32);
LONGLONG ll = Int32x32To64(time70, 10000000) + 116444736000000000;
pftime->dwLowDateTime = (DWORD) ll;
pftime->dwHighDateTime = (DWORD) (ll >> 32);
}

+ 4
- 4
rfb_win32/FolderManager.h View File

@@ -43,14 +43,14 @@ namespace rfb {

bool getInfo(char *pFullPath, FILEINFO *pFIStruct);
bool getFolderInfo(char *pPath, FileInfo *pFileInfo, unsigned int dirOnly);
bool getDirInfo(char *pPath, FileInfo *pFileInfo, unsigned int dirOnly);
bool getDrivesInfo(FileInfo *pFI);
private:
bool getFolderInfoWithPrefix(char *pPrefix, FileInfo *pFileInfo);

unsigned int getTime70(FILETIME ftime);
void getFiletime(unsigned int time70, FILETIME *pftime);

private:
bool getFolderInfoWithPrefix(char *pPrefix, FileInfo *pFileInfo);
};
}
}

+ 177
- 0
vncviewer/FTListView.cxx View File

@@ -0,0 +1,177 @@
/* Copyright (C) 2005 TightVNC Team. All Rights Reserved.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*
* TightVNC distribution homepage on the Web: http://www.tightvnc.com/
*
*/

// -=- FTListView.cxx

#include <vncviewer/FTListView.h>

using namespace rfb;
using namespace rfb::win32;

FTListView::FTListView(HWND hLV)
{
m_hListView = hLV;
m_fileInfo.free();
}

FTListView::~FTListView()
{
m_fileInfo.free();
}


bool
FTListView::initialize()
{
return false;
}

void
FTListView::onGetDispInfo(NMLVDISPINFO *pDI)
{
if (m_fileInfo.getFlagsAt(pDI->item.iItem) & FT_ATTR_DIR) {
pDI->item.iImage = 0;
} else {
pDI->item.iImage = 1;
}
switch (pDI->item.iSubItem)
{
case 0:
pDI->item.pszText = m_fileInfo.getNameAt(pDI->item.iItem);
break;
case 1:
{
unsigned int flags = m_fileInfo.getFlagsAt(pDI->item.iItem);
switch(flags & 0x000000FF)
{
case FT_ATTR_FILE:
{
char buf[32];
unsigned int size = m_fileInfo.getSizeAt(pDI->item.iItem);
sprintf(buf, "%u", size);
pDI->item.pszText = buf;
}
break;
case FT_ATTR_DIR:
pDI->item.pszText = "";
break;
default:
pDI->item.pszText = "Unspecified";
}
}
break;
case 2:
{
unsigned int data = m_fileInfo.getDataAt(pDI->item.iItem);
if (data == 0) {
pDI->item.pszText = "Unspecified";
} else {
FILETIME ft;
FolderManager fm;
fm.getFiletime(data, &ft);
SYSTEMTIME st;
FileTimeToSystemTime(&ft, &st);
char pDateTimeStr[1024];
char timeFmt[128];
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_STIMEFORMAT, timeFmt, 128);
char dateFmt[128];
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SSHORTDATE, dateFmt, 128);
char timeStr[128];
GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, timeFmt, timeStr, 128);
char dateStr[128];
GetDateFormat(LOCALE_USER_DEFAULT, 0, &st, dateFmt, dateStr, 128);
sprintf(pDateTimeStr, "%s %s", dateStr, timeStr);
pDI->item.pszText = pDateTimeStr;
}
}
break;
default:
break;
}
}

void
FTListView::addItems(FileInfo *pFI)
{
m_fileInfo.add(pFI);
LVITEM LVItem;
LVItem.mask = LVIF_TEXT | LVIF_STATE | LVIF_IMAGE;
LVItem.state = 0;
LVItem.stateMask = 0;
for (unsigned int i = 0; i < m_fileInfo.getNumEntries(); i++) {
LVItem.iItem = i;
LVItem.iSubItem = 0;
LVItem.iImage = I_IMAGECALLBACK;
LVItem.pszText = LPSTR_TEXTCALLBACK;
ListView_InsertItem(m_hListView, &LVItem);
}
}

void
FTListView::deleteAllItems()
{
ListView_DeleteAllItems(m_hListView);
m_fileInfo.free();
}

char *
FTListView::getActivateItemName(LPNMITEMACTIVATE lpnmia)
{
return m_fileInfo.getNameAt(lpnmia->iItem);
}

int
FTListView::getSelectedItems(FileInfo *pFI)
{
int selCount = ListView_GetSelectedCount(m_hListView);
int selItem = ListView_GetSelectionMark(m_hListView);
if ((selCount < 1) || (selItem < 0)) return -1;
selItem = -1;
selItem = ListView_GetNextItem(m_hListView, selItem, LVNI_SELECTED);
do {
pFI->add(m_fileInfo.getFullDataAt(selItem));
selItem = ListView_GetNextItem(m_hListView, selItem, LVNI_SELECTED);
} while (selItem >= 0);
return selCount;
}

void
FTListView::initImageList(HINSTANCE hInst)
{
m_hImageList = ImageList_Create(16, 16, ILC_MASK, 2, 2);
HICON hiconItem = LoadIcon(hInst, MAKEINTRESOURCE(IDI_FTDIR));
ImageList_AddIcon(m_hImageList, hiconItem);
DestroyIcon(hiconItem);
hiconItem = LoadIcon(hInst, MAKEINTRESOURCE(IDI_FTFILE));
ImageList_AddIcon(m_hImageList, hiconItem);
DestroyIcon(hiconItem);
ListView_SetImageList(m_hListView, m_hImageList, LVSIL_SMALL);
}

+ 63
- 0
vncviewer/FTListView.h View File

@@ -0,0 +1,63 @@
/* Copyright (C) 2005 TightVNC Team. All Rights Reserved.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*
* TightVNC distribution homepage on the Web: http://www.tightvnc.com/
*
*/

// -=- FTListView.h

#ifndef __RFB_WIN32_FTLISTVIEW_H__
#define __RFB_WIN32_FTLISTVIEW_H__

#include <windows.h>

#include <rfb/FileInfo.h>
#include <rfb_win32/FolderManager.h>
#include <rfb_win32/ListViewControl.h>
#include <vncviewer/resource.h>

namespace rfb {
namespace win32{
class FTListView : private ListViewControl
{
public:
FTListView(HWND hLV);
~FTListView();

bool initialize();
void onGetDispInfo(NMLVDISPINFO *di);
void addItems(FileInfo *pFI);
void deleteAllItems();
void initImageList(HINSTANCE hInst);
char *getActivateItemName(LPNMITEMACTIVATE lpnmia);
int getSelectedItems(FileInfo *pFI);
HWND getWndHandle() { return m_hListView; };
private:
HWND m_hListView;
FileInfo m_fileInfo;
HIMAGELIST m_hImageList;
};
}
}

#endif // __RFB_WIN32_FTLISTVIEW_H__

+ 8
- 0
vncviewer/vncviewer.dsp View File

@@ -150,6 +150,10 @@ SOURCE=.\CViewOptions.cxx
# End Source File
# Begin Source File
SOURCE=.\FTListView.cxx
# End Source File
# Begin Source File
SOURCE=.\InfoDialog.cxx
# End Source File
# Begin Source File
@@ -194,6 +198,10 @@ SOURCE=.\CViewOptions.h
# End Source File
# Begin Source File
SOURCE=.\FTListView.h
# End Source File
# Begin Source File
SOURCE=.\InfoDialog.h
# End Source File
# Begin Source File

Loading…
Cancel
Save