Смекни!
smekni.com

Файловый менеджер (стр. 4 из 7)

BOOL fNC; // is it on NonClient area

// and pt is in screen coords

BOOL fWide; // WIDE character switch

};

class TForm1 : public TForm

{

__published: // IDE-managed Components

TMainMenu *MainMenu1;

TMenuItem *NFile;

TTreeView *TreeView1;

TSplitter *Splitter1;

TListView *ListView1;

TImageList *ImageList1;

TImageList *ImageList2;

TMenuItem *NProperty;

TImageList *ImageList3;

TImageList *ImageList4;

TControlBar *ControlBar1;

TToolBar *TBMain;

void __fastcall TreeView1Expanding(TObject *Sender,

TTreeNode *Node, bool &AllowExpansion);

void __fastcall TreeView1Compare(TObject *Sender, TTreeNode *Node1,

TTreeNode *Node2, int Data, int &Compare);

void __fastcall TreeView1Expanded(TObject *Sender,

TTreeNode *Node);

void __fastcall TreeView1Collapsing(TObject *Sender,

TTreeNode *Node, bool &AllowCollapse);

void __fastcall TreeView1Editing(TObject *Sender, TTreeNode *Node,

bool &AllowEdit);

void __fastcall ListView1Compare(TObject *Sender, TListItem *Item1,

TListItem *Item2, int Data, int &Compare);

void __fastcall ListView1DblClick(TObject *Sender);

void __fastcall ListView1MouseDown(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y);

void __fastcall TreeView1DragOver(TObject *Sender, TObject *Source,

int X, int Y, TDragState State, bool &Accept);

void __fastcall TreeView1DragDrop(TObject *Sender, TObject *Source,

int X, int Y);

void __fastcall TreeView1MouseDown(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y);

void __fastcall NPropertyClick(TObject *Sender);

void __fastcall NOpenClick(TObject *Sender);

void __fastcall NExitClick(TObject *Sender);

void __fastcall NDeleteClick(TObject *Sender);

void __fastcall TBDeleteClick(TObject *Sender);

void __fastcall TBPropertyClick(TObject *Sender);

void __fastcall TBExitClick(TObject *Sender);

void __fastcall NViewClick(TObject *Sender);

void __fastcall NPanelClick(TObject *Sender);

void __fastcall NStatusBarClick(TObject *Sender);

void __fastcall TBUpClick(TObject *Sender);

void __fastcall TreeView1Edited(TObject *Sender, TTreeNode *Node,

AnsiString &S);

void __fastcall ListView1Edited(TObject *Sender, TListItem *Item,

AnsiString &S);

void __fastcall NRenameClick(TObject *Sender);

void __fastcall TBRenameClick(TObject *Sender);

void __fastcall NIconClick(TObject *Sender);

void __fastcall NSmallIconClick(TObject *Sender);

void __fastcall NListClick(TObject *Sender);

void __fastcall NReportClick(TObject *Sender);

void __fastcall ListView1DragOver(TObject *Sender, TObject *Source,

int X, int Y, TDragState State, bool &Accept);

void __fastcall ListView1DragDrop(TObject *Sender, TObject *Source,

int X, int Y);

void __fastcall TBUpdateClick(TObject *Sender);

void __fastcall TreeView1Click(TObject *Sender);

void __fastcall TBPasteClick(TObject *Sender);

void __fastcall TBCopyClick(TObject *Sender);

void __fastcall TBCutClick(TObject *Sender);

void __fastcall NUpdateClick(TObject *Sender);

void __fastcall NCutClick(TObject *Sender);

void __fastcall NPasteClick(TObject *Sender);

void __fastcall NCopyClick(TObject *Sender);

void __fastcall NSelectAllClick(TObject *Sender);

void __fastcall ListView1ColumnClick(TObject *Sender,

TListColumn *Column);

void __fastcall NSort0Click(TObject *Sender);

void __fastcall NCreateFolderClick(TObject *Sender);

void __fastcall NFileClick(TObject *Sender);

void __fastcall NEditClick(TObject *Sender);

void __fastcall ListView1ContextPopup(TObject *Sender,

TPoint &MousePos, bool &Handled);

void __fastcall TreeView1ContextPopup(TObject *Sender,

TPoint &MousePos, bool &Handled);

private: // User declarations

public: // User declarations

__fastcall TForm1(TComponent* Owner);

void ShowDrives();

void ViewChild(TTreeNode *child);

void DeleteChild(TTreeNode *Node);

void ViewFailAndFolderInListView(AnsiString dir);

void ExpandTreeForFile(AnsiString FileName);

int FileAndFolderOperation(char *frombuf, char *tobuf, unsigned int operation);

TTreeNode* AddChildInNodeTree(TTreeNode *Node, AnsiString Dir);

TListItem *AddItemInListView(TSearchRec sr,AnsiString dir);

void ViewProperty();

void OpenFileOrFolder(); //Открыть в Listview файл или папку

void DeleteFileOrFolder();

void PrepareBufForOperationInListView(char * &frombuf);

AnsiString RenameFileOrFolder(AnsiString);

void RecursTree(TTreeNode *node,bool); //Рекурсивное обновление дерева

voidUpdateTreeView(bool); //Функция запуска рекурсивного обновления дерева

voidUpdateListView(bool); //Функция обновления listview

void UpdateAll(bool);

void PasteFileFromClipboard(); //Вставить из буфера

void CopyFileToClipboard(bool); //Копировать файлы в буфер

void CreateFol();

void UpdateLabel();

} ;

//---------------------------------------------------------------------------

extern PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------

#endif

1.2. Листинг Unit1.cpp

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include <shellapi.h>

#include "Unit1.h"

#include <winbase.h>

#include <vector.h>

#include "PropertyFile.h"

#include "PropertyDrive.h"

#include <ole2.h>

#define CFSTR_PREFERREDDROPEFFECT TEXT("Preferred DropEffect")

using namespace std;

vector <int> set_drive_num; //Векторсномерамиустановленныхдисков

TTreeNode *head, *tpItem; //Головаитемповаяпеременная

//указатель на верхний отображаемый

//узел для отсутствия скачков

unsigned int type_file_operation_drag_drop;

//Типоперациипри drag drop

AnsiString CurrentDir=""; //Текущийкаталог

TViewStyle StyleListView=vsReport;

Set<char, 'A', 'Z'> DiskIn;

bool DragnDrop=true; //Флаг разрешения перетаскивания

int ColumnToSort=0; //Номер колонки по которой сортируют

int Direct=1; //Направлениесоритировки

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

voidFirstUpOtherDown(char *str) //Опускает все буквы кроме первой

{

if((str[0]>96 && str[0]<123) || (str[0]>223 && str[0]<255))

str[0]-=32;

for(int i=1;str[i]!='&bsol;0';i++)

if((str[i]>64 && str[i]<91) || (str[i]>191 && str[i]<224))

str[i]+=32;

}

void FirstUpOtherDown(AnsiString &str)

{

if((str[1]>96 && str[1]<123) || (str[1]>223 && str[1]<255))

str[1]-=32;

for(int i=2;i<=str.Length();i++)

if((str[i]>64 && str[i]<91) || (str[i]>191 && str[i]<224))

str[i]+=32;

}

void GetDrives() //Определяет установленные диски

{ //и сохраняет их номера в set_drive_num

unsigned int set_drive=GetLogicalDrives();

for(int i=0;set_drive!=0;i++)

{

if(set_drive%2) set_drive_num.push_back(i);

set_drive>>=1;

}

}

void TForm1::ShowDrives() //Отображаетдискивдереве

{

char str[10];

char inf[20];

for(unsigned int i=0;i<set_drive_num.size();i++)

{

TTreeNode *temp; //Загрузкаузла

str[0]=(char)('A'+set_drive_num[i]);

str[1]='&bsol;0';

strcat(str,":&bsol;");

if(set_drive_num[i]!=0 && set_drive_num[i]!=1) //Заполнениеинформационногополя

{

if(!GetVolumeInformation(str,inf,20,NULL,NULL,NULL,NULL,NULL)) //Получениеметкитома

strcpy(inf,"");

}

else

{

strcpy(inf,"");

}

FirstUpOtherDown(inf);

AnsiString *p=new AnsiString(str);

temp=TreeView1->Items->AddChildObject(head,AnsiString(inf)+" ("+(char)('A'+set_drive_num[i])+":)",p);

switch(unsigned int p=GetDriveType(str)) //Загрузка image

{

case DRIVE_REMOVABLE:

temp->SelectedIndex=ImageFloppy;

temp->ImageIndex=ImageFloppy;

break;

case DRIVE_FIXED:

case DRIVE_RAMDISK:

temp->SelectedIndex=ImageDrive;

temp->ImageIndex=ImageDrive;

break;

case DRIVE_CDROM:

temp->SelectedIndex=ImageCD;

temp->ImageIndex=ImageCD;

break;

default:

temp->SelectedIndex=ImageWindows;

temp->ImageIndex=ImageWindows;

break;

}

}

}

TTreeNode* TForm1::AddChildInNodeTree(TTreeNode *Node, AnsiString Dir)

{

AnsiString temp=Dir;

AnsiString Name=ExtractFileName(temp.SetLength(temp.Length()-1));

FirstUpOtherDown(Name);

AnsiString *p=new AnsiString(Dir); //Добавляемновыйпотомокк treeview

TTreeNode *t=TreeView1->Items->AddChildObject(Node,Name,p);

t->ImageIndex=ImageCloseFolder;

t->SelectedIndex=ImageOpenFolder;

return t; //Возвращаем указатель на него

}

void TForm1::ViewChild(TTreeNode *Node) //Отображение детей узла в treeview

{

//Перебор детей открывамого узла

TTreeNode *child=Node->getFirstChild();

TSearchRec sr;

AnsiString dir,name;

do

{

dir=*((AnsiString *)child->Data);

//Проверка диска на гибкую дискету и вообще отсутствие детей

if((((GetDriveType(dir.c_str())==DRIVE_REMOVABLE) || (GetDriveType(dir.c_str())==DRIVE_CDROM)) && !DiskIn.Contains(ExtractFileDrive(dir)[1])) || FindFirst(dir+"*",faAnyFile,sr)!=0) //Просмотр папок в детях

continue; //Гибкую дискету нельзя отображать из-за обращения к ней при ее отсутствии

do

if((sr.Attr & faDirectory) && sr.Name!="." && sr.Name!="..")

AddChildInNodeTree(child,dir+sr.Name+"&bsol;");

while(FindNext(sr)==0);

FindClose(sr);

}

while((child=Node->GetNextChild(child))!=NULL);

}

void TForm1::DeleteChild(TTreeNode *Node) //Удаление потомков потомков узла (их уже не видно)

{

TTreeNode *child=Node->getFirstChild();

TTreeNode *childchild;

do

while((childchild=child->getFirstChild())!=NULL)

{

delete childchild->Data;

TreeView1->Items->Delete(childchild);

}

while((child=Node->GetNextChild(child))!=NULL);

}

bool CheckExpandedChild(TTreeNode *Node) //Проверка раскрытия ветви хотя бы одного

{ //потомка

bool flag=false;

TTreeNode *child;

if((child=Node->getFirstChild())!=NULL)

do

flag=flag || child->Expanded;

while((child=Node->GetNextChild(child))!=NULL);

return flag;

}

int TForm1::FileAndFolderOperation(char *frombuf, char *tobuf, unsigned int operation)

{ //Осуществление операций над файлами - копирование, перемещение

//удаление, переименование

SHFILEOPSTRUCT OpStruc;

OpStruc.hwnd= Handle;

OpStruc.wFunc= operation;

OpStruc.pFrom= frombuf;

OpStruc.pTo=tobuf;

OpStruc.fFlags=0;

OpStruc.fAnyOperationsAborted= false;

OpStruc.hNameMappings= NULL;

OpStruc.lpszProgressTitle= NULL;

int p=SHFileOperation(&OpStruc);

return p;

}

TListItem *TForm1::AddItemInListView(TSearchRec sr,AnsiString dir)

{ //Добавление записи в listview из sr и каталога dir

TListItem *p;

AnsiString date;

int size=sr.Size/1024;

p=ListView1->Items->Add(); //Добавление нового элемента

FirstUpOtherDown(sr.Name); //Выравнивание у имени символов

DateTimeToString(date,"dd/mm/yy h:nn",FileDateToDateTime(sr.Time));

AnsiString *a;

if(sr.Attr & faDirectory)

{

a=new AnsiString(dir+sr.Name+"&bsol;"); //Сохранение полного имени для доступа

p->SubItems->Add(""); //Для директорий (папок)

p->SubItems->Add("Папка");

p->ImageIndex=ImageCloseFolder;

}

else

{

a=new AnsiString(dir+sr.Name);

SHFILEINFO sfi; //Структура содержащая инфу о файле

ZeroMemory(&sfi,sizeof(sfi)); //Очистка

SHGetFileInfo(sr.Name.c_str(),FILE_ATTRIBUTE_NORMAL,&sfi,sizeof(sfi),

SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME|SHGFI_ICON | SHGFI_SMALLICON); //Получениеданных

TIcon *icon=new TIcon(); //Создание динамической иконки

icon->Handle=sfi.hIcon; //Загрузка в нее дескриптора нужной иконки

int num=ImageList2->AddIcon(icon); //Занесениедескрипторав imagelist

p->ImageIndex=num;

p->SubItems->Add(AnsiString(size==0?1:size)+" KB"); //2 Добавлениеразмера

p->SubItems->Add(sfi.szTypeName); //3 Добавлениеименитипа

ZeroMemory(&sfi,sizeof(sfi));

SHGetFileInfo(sr.Name.c_str(),FILE_ATTRIBUTE_NORMAL,&sfi,sizeof(sfi),

SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME|SHGFI_ICON | SHGFI_LARGEICON ); //Получениеданных

icon->Handle=sfi.hIcon; //Загрузка в нее дескриптора нужной иконки

ImageList4->AddIcon(icon);

delete icon;

}

p->SubItems->Add(date); //4 Добавлениедаты

p->Data=a;

p->Caption=sr.Name; //1 Запись названия

return p;

}

void TForm1::ViewFailAndFolderInListView(AnsiString dir)

{ //Отображение в listview папки указанной dir

for(int i=0;i<ListView1->Items->Count;i++)

delete ListView1->Items->Item[i]->Data; //Очистка данных о полном пути к файлам

ImageList2->Clear();

ImageList4->Clear();

ListView1->Clear(); //Очисткасписка

ImageList2->AddImages(ImageList1);

ImageList4->AddImages(ImageList3);

AnsiString path=dir.SubString(1,3); //Извлечение названия корневого каталога

char inf[20];

unsigned int p=GetDriveType(path.c_str());

if(p==DRIVE_REMOVABLE || p==DRIVE_CDROM)

{

if(GetVolumeInformation(path.c_str(),inf,20,NULL,NULL,NULL,NULL,NULL))

{

if(!(DiskIn.Contains(path[1]))) DiskIn<<path[1];

UpdateTreeView(false);

UpdateLabel();

}

else

{

UpdateTreeView(false);

if(DiskIn.Contains(path[1])) DiskIn>>path[1];

UpdateLabel();

CurrentDir="";

return;

}

}

while(ExtractFileDrive(dir).AnsiCompareIC(dir)!=0 && GetFileAttributes(dir.c_str())==-1)

dir=ExtractFilePath(dir.SetLength(dir.Length()-1));

TSearchRec sr;

if(FindFirst(dir+"*",faAnyFile,sr)!=0) //Просмотрпапоквдетях

return;

do

{

int Attr=FileGetAttr(dir+sr.Name);

if(Attr==-1 || sr.Name=="." || sr.Name=="..")

continue; //Проверка на отсутствующие в действиетельности папки

AddItemInListView(sr,dir);

}

while(FindNext(sr)==0);

FindClose(sr);

CurrentDir=dir; //Запоминание текущего каталога

double c=10.0;