git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.DevExpressVCL@8 05c56307-c608-d34a-929d-697000501d7a
876 lines
29 KiB
C++
876 lines
29 KiB
C++
//---------------------------------------------------------------------------
|
|
#include <vcl.h>
|
|
#pragma hdrstop
|
|
|
|
#include "GroupControlMain.h"
|
|
#include "dxNavBarViewsFact.hpp"
|
|
//---------------------------------------------------------------------------
|
|
#pragma package(smart_init)
|
|
#pragma link "dxNavBar"
|
|
#pragma link "dxNavBarBase"
|
|
#pragma link "dxNavBarCollns"
|
|
|
|
#include <dstring.h>
|
|
#pragma resource "*.dfm"
|
|
TfmGroupControlMain *fmGroupControlMain;
|
|
//---------------------------------------------------------------------------
|
|
__fastcall TfmGroupControlMain::TfmGroupControlMain(TComponent* Owner)
|
|
: TForm(Owner)
|
|
{
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
// PIDL Manipulation
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall DisposePIDL(PItemIDList ID)
|
|
{
|
|
LPMALLOC Malloc;
|
|
|
|
if (ID != NULL)
|
|
{
|
|
OleCheck(SHGetMalloc(&Malloc));
|
|
Malloc->Free(ID);
|
|
}
|
|
}
|
|
|
|
PItemIDList __fastcall CopyITEMID(LPMALLOC Malloc, PItemIDList ID)
|
|
{
|
|
void * Result = Malloc->Alloc(ID->mkid.cb + sizeof(ID->mkid.cb));
|
|
CopyMemory(Result, ID, ID->mkid.cb + sizeof(ID->mkid.cb));
|
|
return (PItemIDList)Result;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
PItemIDList __fastcall NextPIDL(PItemIDList IDList)
|
|
{
|
|
PItemIDList Result = IDList;
|
|
Result = PItemIDList(PChar(Result) + IDList->mkid.cb);
|
|
return Result;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
int __fastcall GetPIDLSize(PItemIDList IDList)
|
|
{
|
|
int Result = 0;
|
|
if (IDList != NULL)
|
|
{
|
|
Result = sizeof(IDList->mkid.cb);
|
|
while (IDList->mkid.cb != 0)
|
|
{
|
|
Result = Result + IDList->mkid.cb;
|
|
IDList = NextPIDL(IDList);
|
|
}
|
|
}
|
|
return Result;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
PItemIDList __fastcall StripLastID(PItemIDList IDList)
|
|
{
|
|
PItemIDList MarkerID;
|
|
|
|
MarkerID = IDList;
|
|
if (IDList != NULL)
|
|
{
|
|
while (IDList->mkid.cb != 0)
|
|
{
|
|
MarkerID = IDList;
|
|
IDList = NextPIDL(IDList);
|
|
}
|
|
MarkerID->mkid.cb = 0;
|
|
}
|
|
return MarkerID;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
PItemIDList __fastcall CreatePIDL(int Size)
|
|
{
|
|
LPMALLOC Malloc;
|
|
HRESULT HR;
|
|
void * Result;
|
|
|
|
Result = NULL;
|
|
|
|
|
|
if (!FAILED(SHGetMalloc(&Malloc)))
|
|
{
|
|
Result = Malloc->Alloc(Size);
|
|
if ((PItemIDList)Result != NULL)
|
|
{
|
|
memset(Result,0, sizeof(Result));
|
|
}
|
|
|
|
}
|
|
return (PItemIDList) Result;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
PItemIDList __fastcall CopyPIDL(PItemIDList IDList)
|
|
{
|
|
int Size;
|
|
PItemIDList Result;
|
|
|
|
Size = GetPIDLSize(IDList);
|
|
Result = CreatePIDL(Size);
|
|
if (Result != NULL)
|
|
{
|
|
CopyMemory(Result, IDList, Size);
|
|
}
|
|
return Result;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
PItemIDList __fastcall ConcatPIDLs(PItemIDList IDList1, PItemIDList IDList2)
|
|
{
|
|
int cb1;
|
|
int cb2;
|
|
PItemIDList Result;
|
|
|
|
if (IDList1 != NULL)
|
|
cb1 = GetPIDLSize(IDList1) - sizeof(IDList1->mkid.cb);
|
|
else
|
|
cb1 = 0;
|
|
|
|
cb2 = GetPIDLSize(IDList2);
|
|
|
|
Result = CreatePIDL(cb1 + cb2);
|
|
if (Result != NULL)
|
|
{
|
|
if (IDList1 != NULL)
|
|
CopyMemory(Result, IDList1, cb1);
|
|
CopyMemory(PChar(Result) + cb1, IDList2, cb2);
|
|
}
|
|
return Result;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
// Shell Folder Item Info
|
|
//---------------------------------------------------------------------------
|
|
|
|
int __fastcall GetShellImage(PItemIDList PIDL, bool Large, bool Open)
|
|
{
|
|
TSHFileInfo FileInfo;
|
|
int Flags;
|
|
int Result;
|
|
|
|
memset(&FileInfo, 0, sizeof(FileInfo));
|
|
Flags = SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_ICON;
|
|
|
|
if (Open)
|
|
Flags = Flags | SHGFI_OPENICON;
|
|
if (Large)
|
|
Flags = Flags | SHGFI_LARGEICON;
|
|
else
|
|
Flags = Flags | SHGFI_SMALLICON;
|
|
|
|
SHGetFileInfo(PChar(PIDL), 0, &FileInfo, sizeof(FileInfo), Flags);
|
|
Result = FileInfo.iIcon;
|
|
return Result;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
bool IsFolder(PShellItem * ShellItem)
|
|
{
|
|
if (ShellItem->TypeName == "File Folder")
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
bool IsFolder(LPSHELLFOLDER ShellFolder, PItemIDList ID)
|
|
{
|
|
unsigned long Flags;
|
|
bool Result;
|
|
|
|
Flags = SFGAO_FOLDER;
|
|
|
|
ShellFolder->GetAttributesOf(1, (const _ITEMIDLIST **) &ID, &Flags);
|
|
Result = ((SFGAO_FOLDER & Flags) !=0);
|
|
|
|
return Result;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
bool __fastcall ValidFileTime(TFileTime FileTime)
|
|
{
|
|
bool Result = ((FileTime.dwLowDateTime != 0) || (FileTime.dwHighDateTime != 0));
|
|
return Result;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
int __fastcall ListSortFunc(void * Item1, void * Item2)
|
|
{
|
|
return Smallint(fmGroupControlMain->ShellFolder->CompareIDs(0,
|
|
((PShellItem *)Item1)->ID, ((PShellItem *)Item2)->ID));
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
AnsiString __fastcall GetDisplayName(LPSHELLFOLDER ShellFolder, PItemIDList PIDL,
|
|
bool ForParsing)
|
|
{
|
|
|
|
TStrRet StrRet;
|
|
PChar P;
|
|
int Flags;
|
|
AnsiString * Result;
|
|
|
|
if (ForParsing)
|
|
{
|
|
Flags = SHGDN_FORPARSING;
|
|
}
|
|
else
|
|
Flags = SHGDN_NORMAL;
|
|
|
|
ShellFolder->GetDisplayNameOf(PIDL, Flags, &StrRet);
|
|
|
|
switch (StrRet.uType)
|
|
{
|
|
case STRRET_CSTR: Result = new AnsiString(StrRet.cStr, strlen(StrRet.cStr));
|
|
break;
|
|
case STRRET_OFFSET: P = &PIDL->mkid.abID[StrRet.uOffset - sizeof(PIDL->mkid.cb)];
|
|
Result = new AnsiString(P);
|
|
break;
|
|
case STRRET_WSTR: Result = new AnsiString(StrRet.pOleStr);
|
|
break;
|
|
}
|
|
return (*Result);
|
|
}
|
|
//--------------------------------------------------------------------------
|
|
// ShellItem Constructor.
|
|
//--------------------------------------------------------------------------
|
|
PShellItem::PShellItem()
|
|
{
|
|
FullID = NULL;
|
|
ID = NULL;
|
|
Empty = true;
|
|
DisplayName = "";
|
|
TypeName = "";
|
|
ModDate = "";
|
|
ImageIndex = 0;
|
|
Size = 0;
|
|
Attributes = 0;
|
|
}
|
|
|
|
void __fastcall TfmGroupControlMain::FormCreate(TObject *Sender)
|
|
{
|
|
cbViews->Items->Clear();
|
|
for(int I = 0; I < dxNavBarViewsFactory()->Count; I ++)
|
|
cbViews->Items->Add(dxNavBarViewsFactory()->Names[I]);
|
|
cbViews->ItemIndex = nbMain->View;
|
|
|
|
SHFILEINFO FileInfo;
|
|
THandle ImageListHandle;
|
|
PItemIDList NewPIDL;
|
|
|
|
FIDList = new TList();
|
|
OleCheck(SHGetDesktopFolder(&FDesktopFolder));
|
|
|
|
ImageListHandle = SHGetFileInfo("C:\\", 0, &FileInfo, sizeof(FileInfo), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
|
|
SendMessage(lvMain->Handle, LVM_SETIMAGELIST, LVSIL_SMALL, ImageListHandle);
|
|
SendMessage(lvMyFavorites->Handle, LVM_SETIMAGELIST, LVSIL_SMALL, ImageListHandle);
|
|
SendMessage(tvMyComputer->Handle, TVM_SETIMAGELIST, TVSIL_NORMAL, ImageListHandle);
|
|
|
|
ImageListHandle = SHGetFileInfo("C:\\", 0, &FileInfo, sizeof(FileInfo), SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
|
|
SendMessage(lvMain->Handle, LVM_SETIMAGELIST, LVSIL_NORMAL, ImageListHandle);
|
|
SendMessage(lvMyFavorites->Handle, LVM_SETIMAGELIST, LVSIL_NORMAL, ImageListHandle);
|
|
|
|
|
|
OleCheck(SHGetSpecialFolderLocation(Application->Handle, CSIDL_DRIVES, &NewPIDL));
|
|
SetPath(NewPIDL);
|
|
|
|
PopulateMyFavoritesList(GetIDBySpetialFolder(CSIDL_FAVORITES));
|
|
PopulateMyComputerTree(NewPIDL);
|
|
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
LPSHELLFOLDER __fastcall TfmGroupControlMain::GetShellFolder()
|
|
{
|
|
return GetShellFolderByID(FShellID);
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
Integer __fastcall TfmGroupControlMain::GetShellItemCount()
|
|
{
|
|
return FIDList->Count;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
PShellItem* __fastcall TfmGroupControlMain::GetShellItem(Integer Index)
|
|
{
|
|
return (PShellItem *)FIDList->Items[Index];
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TfmGroupControlMain::ClearIDList()
|
|
{
|
|
for (int I = 0; I <= FIDList->Count-1; I++)
|
|
{
|
|
DisposePIDL(ShellItems[I]->ID);
|
|
FIDList->Delete(I);
|
|
}
|
|
FIDList->Clear();
|
|
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
PItemIDList __fastcall TfmGroupControlMain::GetIDByPath(AnsiString APath)
|
|
{
|
|
wchar_t * P;
|
|
PItemIDList NewPIDL;
|
|
unsigned long int Flags;
|
|
unsigned long int NumChars;
|
|
|
|
NumChars = APath.Length();
|
|
Flags = 0;
|
|
P = StringToOleStr(APath);
|
|
|
|
OleCheck( FDesktopFolder->ParseDisplayName( Application->Handle, NULL,
|
|
P, &NumChars, &NewPIDL, &Flags));
|
|
return NewPIDL;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
PItemIDList __fastcall TfmGroupControlMain::GetIDBySpetialFolder(Integer ASpetialFolder)
|
|
{
|
|
PItemIDList NewPIDL;
|
|
OleCheck( SHGetSpecialFolderLocation(Application->Handle, ASpetialFolder, &NewPIDL));
|
|
return NewPIDL;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
LPSHELLFOLDER __fastcall TfmGroupControlMain::GetShellFolderByID(PItemIDList AID)
|
|
{
|
|
LPSHELLFOLDER NewShellFolder;
|
|
if (AID != NULL)
|
|
OleCheck(FDesktopFolder->BindToObject(AID, NULL, IID_IShellFolder,
|
|
(void **)&NewShellFolder));
|
|
else NewShellFolder = NULL;
|
|
return NewShellFolder;
|
|
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
LPENUMIDLIST __fastcall TfmGroupControlMain::GetEnumIDListByFolder(LPSHELLFOLDER AFolder)
|
|
{
|
|
|
|
UINT Flags = SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN;
|
|
LPENUMIDLIST EnumList;
|
|
if (AFolder != NULL)
|
|
OleCheck( AFolder->EnumObjects( Application->Handle, Flags, &EnumList));
|
|
else EnumList = NULL;
|
|
return EnumList;
|
|
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
bool __fastcall TfmGroupControlMain::CompareNames(AnsiString Path, AnsiString Pattern)
|
|
{
|
|
int APos;
|
|
AnsiString S, Name, Extention, PatName, PatExt;
|
|
S = Path;
|
|
do
|
|
{
|
|
APos = S.Pos("\\");
|
|
if (APos > 0) S.Delete(1, APos);
|
|
}
|
|
while (APos != 0);
|
|
APos = S.Pos(".");
|
|
if (APos > 0)
|
|
{
|
|
Name = S;
|
|
Name = UpperCase(Name.Delete(APos, Name.Length() - 1));
|
|
Extention = UpperCase(S.Delete(1, APos));
|
|
}
|
|
else
|
|
{
|
|
Name = UpperCase(S);
|
|
Extention = "";
|
|
}
|
|
Pattern = UpperCase(Pattern);
|
|
APos = Pattern.Pos(".");
|
|
if (APos > 0)
|
|
{
|
|
S = Pattern;
|
|
PatName = S.Delete(APos, S.Length() - 1);
|
|
PatExt = Pattern.Delete(1, APos);
|
|
}
|
|
else
|
|
{
|
|
PatName = Pattern;
|
|
PatExt = "";
|
|
}
|
|
return (((Name == PatName) || (PatName == "*")) &&
|
|
((Extention == PatExt) || (PatExt == "*") || (PatExt == ""))) ||
|
|
((PatExt == "") && (PatName != "") && (Name.Pos(PatName) > 0));
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TfmGroupControlMain::SetSearch(PItemIDList AID, AnsiString Pattern)
|
|
{
|
|
lvMain->Items->BeginUpdate();
|
|
try
|
|
{
|
|
FSearching = true;
|
|
btnSearch->Caption = "Stop";
|
|
try
|
|
{
|
|
PopulateSearchIDList(AID, Pattern);
|
|
if (lvMain->Items->Count > 0)
|
|
{
|
|
lvMain->Selected = lvMain->Items->Item[0];
|
|
lvMain->Selected->Focused = true;
|
|
lvMain->Selected->MakeVisible(false);
|
|
}
|
|
}
|
|
__finally
|
|
{
|
|
StatusBar1->SimpleText = "";
|
|
btnSearch->Caption = "Search";
|
|
FSearching = false;
|
|
}
|
|
}
|
|
__finally
|
|
{
|
|
lvMain->Items->EndUpdate();
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TfmGroupControlMain::SetPath(const AnsiString Value)
|
|
{
|
|
LPITEMIDLIST NewPIDL = GetIDByPath(Value);
|
|
SetPath(NewPIDL);
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TfmGroupControlMain::SetPath(LPITEMIDLIST ID)
|
|
{
|
|
lvMain->Items->BeginUpdate();
|
|
try
|
|
{
|
|
PopulateIDList(ID);
|
|
if (lvMain->Items->Count > 0)
|
|
{
|
|
lvMain->Selected = lvMain->Items->Item[0];
|
|
lvMain->Selected->Focused = true;
|
|
lvMain->Selected->MakeVisible(false);
|
|
}
|
|
}
|
|
__finally
|
|
{
|
|
lvMain->Items->EndUpdate();
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TfmGroupControlMain::PopulateIDList(PItemIDList AID)
|
|
{
|
|
PShellItem * ShellItem;
|
|
unsigned long NumIDs;
|
|
PItemIDList ID;
|
|
|
|
LPSHELLFOLDER AShellFolder = GetShellFolderByID(AID);
|
|
TCursor SaveCursor = Screen->Cursor;
|
|
try
|
|
{
|
|
Screen->Cursor = crHourGlass;
|
|
ClearIDList();
|
|
LPENUMIDLIST EnumList = GetEnumIDListByFolder(AShellFolder);
|
|
|
|
FShellID = AID;
|
|
FSearchShellID = NULL;
|
|
while (EnumList->Next(1, &ID, &NumIDs) == S_OK)
|
|
{
|
|
ShellItem = new PShellItem;
|
|
ShellItem->ID = ID;
|
|
ShellItem->ParentID = AID;
|
|
ShellItem->ShellFolder = ShellFolder;
|
|
ShellItem->DisplayName = GetDisplayName(AShellFolder, ID, false);
|
|
ShellItem->Empty = true;
|
|
FIDList->Add(ShellItem);
|
|
}
|
|
FIDList->Sort(ListSortFunc);
|
|
}
|
|
__finally
|
|
{
|
|
lvMain->Items->Count = ShellItemCount;
|
|
lvMain->Repaint();
|
|
Screen->Cursor = SaveCursor;
|
|
}
|
|
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TfmGroupControlMain::CheckFolder(PItemIDList AID, AnsiString Pattern)
|
|
{
|
|
PShellItem * ShellItem;
|
|
unsigned long NumIDs;
|
|
PItemIDList ID;
|
|
|
|
LPSHELLFOLDER AFolder = GetShellFolderByID(AID);
|
|
LPENUMIDLIST EnumList = GetEnumIDListByFolder(AFolder);
|
|
while (EnumList->Next(1, &ID, &NumIDs) == S_OK)
|
|
{
|
|
if (CompareNames(GetDisplayName(AFolder, ID, true), Pattern))
|
|
{
|
|
ShellItem = new PShellItem;
|
|
ShellItem->ID = ID;
|
|
ShellItem->ParentID = AID;
|
|
ShellItem->ShellFolder = AFolder;
|
|
ShellItem->DisplayName = GetDisplayName(AFolder, ID, false);
|
|
ShellItem->Empty = true;
|
|
FIDList->Add(ShellItem);
|
|
}
|
|
Application->ProcessMessages();
|
|
if (!FSearching) return;
|
|
|
|
if (IsFolder(AFolder, ID))
|
|
{
|
|
StatusBar1->SimpleText = Format("Search in %s ...",
|
|
ARRAYOFCONST((GetDisplayName(AFolder, ID, false))));
|
|
CheckFolder(ConcatPIDLs(AID, ID), Pattern);
|
|
}
|
|
}
|
|
lvMain->Items->Count = ShellItemCount;
|
|
lvMain->Repaint();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TfmGroupControlMain::PopulateSearchIDList(PItemIDList ASearchID, AnsiString Pattern)
|
|
{
|
|
FSearchShellID = ASearchID;
|
|
ClearIDList();
|
|
CheckFolder(ASearchID, Pattern);
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TfmGroupControlMain::PopulateMyFavoritesList(PItemIDList AID)
|
|
{
|
|
unsigned long NumIDs;
|
|
PItemIDList ID;
|
|
|
|
LPSHELLFOLDER AShellFolder = GetShellFolderByID(AID);
|
|
lvMyFavorites->Items->BeginUpdate();
|
|
TCursor SaveCursor = Screen->Cursor;
|
|
try
|
|
{
|
|
Screen->Cursor = crHourGlass;
|
|
LPENUMIDLIST EnumList = GetEnumIDListByFolder(AShellFolder);
|
|
while (EnumList->Next(1, &ID, &NumIDs) == S_OK)
|
|
{
|
|
TListItem* AItem = lvMyFavorites->Items->Add();
|
|
PItemIDList FullID = ConcatPIDLs(AID, ID);
|
|
AItem->Caption = GetDisplayName(AShellFolder, ID, false);
|
|
AItem->ImageIndex = GetShellImage(FullID, false, false);
|
|
|
|
TSHFileInfo FileInfo;
|
|
SHGetFileInfo(PChar(FullID), 0, &FileInfo, sizeof(FileInfo), SHGFI_TYPENAME | SHGFI_PIDL);
|
|
AItem->SubItems->Add(FileInfo.szTypeName);
|
|
if (IsFolder(AShellFolder, ID))
|
|
AItem->Data = FullID;
|
|
else AItem->Data = NULL;
|
|
}
|
|
}
|
|
__finally
|
|
{
|
|
lvMyFavorites->Repaint();
|
|
lvMyFavorites->Items->EndUpdate();
|
|
Screen->Cursor = SaveCursor;
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TfmGroupControlMain::PopulateMyComputerTree(PItemIDList AID)
|
|
{
|
|
unsigned long NumIDs;
|
|
PItemIDList ID;
|
|
|
|
TTreeNode* ANode = tvMyComputer->Items->Add(NULL, "MyComputer");
|
|
ANode->ImageIndex = GetShellImage(AID, false, false);
|
|
ANode->SelectedIndex = GetShellImage(AID, false, false);
|
|
ANode->Data = AID;
|
|
LPSHELLFOLDER AShellFolder = GetShellFolderByID(AID);
|
|
tvMyComputer->Items->BeginUpdate();
|
|
TCursor SaveCursor = Screen->Cursor;
|
|
try
|
|
{
|
|
Screen->Cursor = crHourGlass;
|
|
LPENUMIDLIST EnumList = GetEnumIDListByFolder(AShellFolder);
|
|
while (EnumList->Next(1, &ID, &NumIDs) == S_OK)
|
|
{
|
|
TTreeNode* AItemNode = tvMyComputer->Items->AddChild(ANode, GetDisplayName(AShellFolder, ID, false));
|
|
PItemIDList FullID = ConcatPIDLs(AID, ID);
|
|
AItemNode->ImageIndex = GetShellImage(FullID, false, false);
|
|
AItemNode->SelectedIndex = GetShellImage(FullID, false, false);
|
|
if (IsFolder(AShellFolder, ID))
|
|
AItemNode->Data = FullID;
|
|
else AItemNode->Data = NULL;
|
|
}
|
|
}
|
|
__finally
|
|
{
|
|
// tvMyComputer->SortType = (TSortType)stText;
|
|
tvMyComputer->Items->EndUpdate();
|
|
Screen->Cursor = SaveCursor;
|
|
}
|
|
tvMyComputer->FullExpand();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
void __fastcall TfmGroupControlMain::CheckShellItems(int StartIndex, int EndIndex)
|
|
{
|
|
TWin32FindData FileData;
|
|
TSHFileInfo FileInfo;
|
|
TSystemTime SysTime;
|
|
int I;
|
|
TFileTime LocalFileTime;
|
|
|
|
for(I = StartIndex; I <= EndIndex; I++)
|
|
{
|
|
if (GetShellItem(I)->Empty)
|
|
{
|
|
GetShellItem(I)->FullID = ConcatPIDLs(GetShellItem(I)->ParentID, GetShellItem(I)->ID);
|
|
GetShellItem(I)->ImageIndex = GetShellImage(GetShellItem(I)->FullID, (lvMain->ViewStyle == vsIcon), false);
|
|
|
|
SHGetFileInfo(PChar(GetShellItem(I)->FullID), 0, &FileInfo, sizeof(FileInfo), SHGFI_TYPENAME | SHGFI_PIDL);
|
|
GetShellItem(I)->TypeName = FileInfo.szTypeName;
|
|
|
|
memset(&FileData, 0, sizeof(FileData));
|
|
SHGetDataFromIDList(ShellFolder, GetShellItem(I)->ID, SHGDFIL_FINDDATA, &FileData, sizeof(FileData));
|
|
|
|
GetShellItem(I)->Size = FileData.nFileSizeLow/1000;
|
|
if (GetShellItem(I)->Size == 0)
|
|
GetShellItem(I)->Size = 1;
|
|
|
|
memset(&LocalFileTime, 0, sizeof(LocalFileTime));
|
|
if (ValidFileTime(FileData.ftLastWriteTime)&&
|
|
FileTimeToLocalFileTime(&(FileData.ftLastWriteTime),
|
|
&LocalFileTime)&&
|
|
FileTimeToSystemTime(&LocalFileTime, &SysTime))
|
|
{
|
|
try
|
|
{
|
|
GetShellItem(I)->ModDate = DateTimeToStr(SystemTimeToDateTime(SysTime));
|
|
}
|
|
catch(EConvertError &E)
|
|
{
|
|
GetShellItem(I)->ModDate = "";
|
|
}
|
|
}
|
|
else
|
|
GetShellItem(I)->ModDate = "";
|
|
|
|
GetShellItem(I)->Attributes = FileData.dwFileAttributes;
|
|
|
|
GetShellItem(I)->Empty = False;
|
|
}
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TfmGroupControlMain::lvMainCustomDrawItem(
|
|
TCustomListView *Sender, TListItem *Item, TCustomDrawState State,
|
|
bool &DefaultDraw)
|
|
{
|
|
int Attrs = 0;
|
|
if (Item != NULL)
|
|
{
|
|
Attrs = GetShellItem(Item->Index)->Attributes;
|
|
}
|
|
if (BOOL(Attrs & FILE_ATTRIBUTE_READONLY))
|
|
lvMain->Canvas->Font->Color = clGrayText;
|
|
if (BOOL(Attrs & FILE_ATTRIBUTE_HIDDEN))
|
|
lvMain->Canvas->Font->Style = lvMain->Canvas->Font->Style << fsStrikeOut;
|
|
if (BOOL(Attrs & FILE_ATTRIBUTE_SYSTEM))
|
|
lvMain->Canvas->Font->Color = clHighlight;
|
|
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TfmGroupControlMain::lvMainCustomDrawSubItem(
|
|
TCustomListView *Sender, TListItem *Item, int SubItem,
|
|
TCustomDrawState State, bool &DefaultDraw)
|
|
{
|
|
if (SubItem != 0)
|
|
lvMain->Canvas->Font->Color = (TColor)GetSysColor(COLOR_WINDOWTEXT);
|
|
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TfmGroupControlMain::lvMainData(TObject *Sender,
|
|
TListItem *Item)
|
|
{
|
|
AnsiString Attrs;
|
|
PShellItem * ShellItem;
|
|
|
|
if ((Item->Index < FIDList->Count))
|
|
{
|
|
|
|
ShellItem = GetShellItem(Item->Index);
|
|
Item->Caption = ShellItem->DisplayName;
|
|
Item->ImageIndex = ShellItem->ImageIndex;
|
|
|
|
if (lvMain->ViewStyle == vsReport)
|
|
{
|
|
if (!(IsFolder(ShellFolder, ShellItem->ID)))
|
|
Item->SubItems->Add(Format("%dKB", ARRAYOFCONST((ShellItem->Size))));
|
|
else
|
|
Item->SubItems->Add("");
|
|
|
|
Item->SubItems->Add(ShellItem->TypeName);
|
|
|
|
Item->SubItems->Add(ShellItem->ModDate);
|
|
|
|
if (BOOL(ShellItem->Attributes & FILE_ATTRIBUTE_READONLY))
|
|
Attrs = Attrs + 'R';
|
|
if (BOOL(ShellItem->Attributes & FILE_ATTRIBUTE_HIDDEN))
|
|
Attrs = Attrs + 'H';
|
|
if (BOOL(ShellItem->Attributes & FILE_ATTRIBUTE_SYSTEM))
|
|
Attrs = Attrs + 'S';
|
|
if (BOOL(ShellItem->Attributes & FILE_ATTRIBUTE_ARCHIVE))
|
|
Attrs = Attrs + 'A';
|
|
|
|
Item->SubItems->Add(Attrs);
|
|
}
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TfmGroupControlMain::lvMainDataFind(TObject *Sender,
|
|
TItemFind Find, const AnsiString FindString,
|
|
const TPoint &FindPosition, Pointer FindData, int StartIndex,
|
|
TSearchDirection Direction, bool Wrap, int &Index)
|
|
{
|
|
bool Found;
|
|
PShellItem * ShellItem;
|
|
|
|
int I = StartIndex;
|
|
|
|
if ((Find == ifExactString) || (Find == ifPartialString))
|
|
{
|
|
do
|
|
{
|
|
ShellItem = GetShellItem(I);
|
|
if (I == FIDList->Count-1)
|
|
{
|
|
if (Wrap)
|
|
I = 0;
|
|
else
|
|
break;
|
|
}
|
|
Found = (UpperCase(ShellItem->DisplayName)).Pos(UpperCase(FindString)) == 1;
|
|
I++;
|
|
}while (!Found && (I != StartIndex));
|
|
if (Found)
|
|
Index = I-1;
|
|
|
|
}
|
|
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TfmGroupControlMain::lvMainDataHint(TObject *Sender,
|
|
int StartIndex, int EndIndex)
|
|
{
|
|
if ((StartIndex < FIDList->Count) && (EndIndex < FIDList->Count))
|
|
CheckShellItems(StartIndex, EndIndex);
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TfmGroupControlMain::lvMainDblClick(TObject *Sender)
|
|
{
|
|
if (lvMain->Selected != NULL)
|
|
{
|
|
PItemIDList AID = ShellItems[lvMain->Selected->Index]->ID;
|
|
PItemIDList AParentID = ShellItems[lvMain->Selected->Index]->ParentID;
|
|
if (FSearchShellID == NULL)
|
|
{
|
|
LPSHELLFOLDER AShellFolder = ShellItems[lvMain->Selected->Index]->ShellFolder;
|
|
if (IsFolder(AShellFolder, AID)) SetPath(ConcatPIDLs(AParentID, AID));
|
|
}
|
|
else SetPath(AParentID);
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TfmGroupControlMain::lvMainKeyDown(TObject *Sender,
|
|
WORD &Key, TShiftState Shift)
|
|
{
|
|
switch(Key)
|
|
{
|
|
case VK_RETURN: lvMainDblClick(Sender);
|
|
break;
|
|
case VK_BACK: btnBackClick(Sender);
|
|
break;
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TfmGroupControlMain::btnBackClick(TObject *Sender)
|
|
{
|
|
if (FSearchShellID == NULL)
|
|
{
|
|
PItemIDList Temp = CopyPIDL(FShellID);
|
|
if (Temp != NULL)
|
|
StripLastID(Temp);
|
|
if (Temp->mkid.cb != 0)
|
|
SetPath(Temp);
|
|
else Beep();
|
|
}
|
|
else SetPath(FSearchShellID);
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TfmGroupControlMain::btnLargeIconsClick(TObject *Sender)
|
|
{
|
|
lvMain->ViewStyle = (TViewStyle)(((TComponent*)Sender)->Tag);
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TfmGroupControlMain::biDesktopClick(TObject *Sender)
|
|
{
|
|
SetPath(GetIDBySpetialFolder(CSIDL_DESKTOPDIRECTORY));
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TfmGroupControlMain::biMyDocumentsClick(TObject *Sender)
|
|
{
|
|
SetPath(GetIDBySpetialFolder(CSIDL_PERSONAL));
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TfmGroupControlMain::biNetworkClick(TObject *Sender)
|
|
{
|
|
SetPath(GetIDBySpetialFolder(CSIDL_NETWORK));
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TfmGroupControlMain::FormDestroy(TObject *Sender)
|
|
{
|
|
ClearIDList();
|
|
FIDList->Free();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TfmGroupControlMain::Form1Close(TObject *Sender,
|
|
TCloseAction &Action)
|
|
{
|
|
FSearching = false;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TfmGroupControlMain::btnSearchClick(TObject *Sender)
|
|
{
|
|
if (!FSearching)
|
|
SetSearch(FShellID, edSearch->Text);
|
|
else FSearching = false;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TfmGroupControlMain::tvMyComputerClick(TObject *Sender)
|
|
{
|
|
if (tvMyComputer->Selected != NULL && tvMyComputer->Selected->Data != NULL)
|
|
SetPath(PItemIDList(tvMyComputer->Selected->Data));
|
|
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TfmGroupControlMain::lvMyFavoritesClick(TObject *Sender)
|
|
{
|
|
if (lvMyFavorites->Selected != NULL && lvMyFavorites->Selected->Data != NULL)
|
|
SetPath(PItemIDList(lvMyFavorites->Selected->Data));
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TfmGroupControlMain::cbViewsChange(TObject *Sender)
|
|
{
|
|
nbMain->View = cbViews->ItemIndex;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|