Смекни!
smekni.com

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

if(hGlobal)

MoveMemory(&lngEffect,hGlobal, 4);

if((lngEffect & DROPEFFECT_COPY) == DROPEFFECT_COPY)

FileAndFolderOperation(frombuf,tobuf , FO_COPY);

if((lngEffect & DROPEFFECT_MOVE) == DROPEFFECT_MOVE)

FileAndFolderOperation(frombuf,tobuf , FO_MOVE);

UpdateAll(false);

}

CloseClipboard();

}

void TForm1::CopyFileToClipboard(bool Copy)

{

if(CurrentDir=="") return;

char *frombuf;

unsigned int uDropEffect, uBufLen;

DROPFILES dropFiles;

unsigned int uGblLen,uDropFilesLen;

HGLOBAL hGblFiles,hGblEffect;

char *szData,*szFileList;

DWORD *dwDropEffect;

uDropEffect=RegisterClipboardFormat("Preferred DropEffect"); //Регистрацияформата

//дляуказаниятипакопирования

hGblEffect=GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE,sizeof(DWORD));

dwDropEffect=(DWORD*)GlobalLock(hGblEffect); //Выделениепамятиподхранение

if(Copy) //инфы о виде перемещения

*dwDropEffect=DROPEFFECT_COPY; //Записьэтойинфы

else

*dwDropEffect=DROPEFFECT_MOVE;

GlobalUnlock(hGblEffect); //Разлочиваниепамяти

uDropFilesLen=sizeof(DROPFILES); //Заполнение структуры содержащей инфу

dropFiles.pFiles =uDropFilesLen; //о строке с именами перемещаемых файлов

dropFiles.pt.x=0;

dropFiles.pt.y=0;

dropFiles.fNC =FALSE;

dropFiles.fWide =FALSE;//TRUE;

if(ListView1->ItemFocused==NULL)

{

if(TreeView1->Selected!=NULL) //Есливфокусенаходится treeview

if(TreeView1->Selected->Level>1)

{

AnsiString sourcestr=*((AnsiString *)(TreeView1->Selected->Data));

sourcestr.SetLength(sourcestr.Length()-1);

frombuf=new char[MAX_PATH+1];

strcpy(frombuf,sourcestr.c_str());

finstr(frombuf);

}

else

return; //Выход в том случае если в фокусе Диск или Мой компьютер

}

else if((ListView1->Selected)!=NULL)

PrepareBufForOperationInListView(frombuf);

uBufLen=lengthfinstr(frombuf);

uGblLen=uDropFilesLen+uBufLen+2;

hGblFiles= GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, uGblLen);

szData=(char*)GlobalLock(hGblFiles);

memcpy(szData,&dropFiles,uDropFilesLen);

szFileList=szData+uDropFilesLen;

memcpy(szFileList,frombuf,uBufLen);

/*MultiByteToWideChar(CP_ACP,MB_COMPOSITE,

frombuf,uBufLen,(WCHAR *)szFileList,uBufLen*2+8);*/

GlobalUnlock(hGblFiles);

if( OpenClipboard(NULL) )

{

EmptyClipboard();

SetClipboardData( CF_HDROP, hGblFiles );

SetClipboardData(uDropEffect,hGblEffect);

CloseClipboard();

}

}

void TForm1::CreateFol() //Создаетпапкувтекущемкаталоге

{

if(CurrentDir=="") return;

AnsiString c="Новая папка",dir; //Производит поиск отсутствующей папки

for(int i=1;(GetFileAttributes((dir=CurrentDir+c+i).c_str()))!=-1;i++);

if(ListView1->Selected!=NULL) //Еслиестьвыделенныеузлы

for(int i=0;i<ListView1->Items->Count;i++) //отменяемвыделение

ListView1->Items->Item[i]->Selected=false;

if(CreateDir(dir)) //Создаетее

{

TSearchRec sr;

FindFirst(dir,faDirectory,sr);

TListItem *p=AddItemInListView(sr,ExtractFilePath(dir));

ListView1->ItemFocused=p;

p->Selected=true;

p->EditCaption();

}

UpdateAll(false);

}

//*************************************************************************

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

//***********************************************************************

__fastcall TForm1::TForm1(TComponent* Owner) //Конструкторформы

: TForm(Owner)

{

ShortDateFormat="dd/mm/yy";

DateSeparator = '/';

TimeSeparator=':';

ShortTimeFormat="h:nn";

AnsiString *a=new AnsiString("");

TreeView1->Items->Item[0]->Data=a;

head=TreeView1->Items->Item[0]; //Сохранениекорня

GetDrives(); //Загрузкадисков

ShowDrives(); //Отображениев treview

TreeView1->AlphaSort();

}

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

void __fastcall TForm1::TreeView1Expanding(TObject *Sender,

TTreeNode *Node, bool &AllowExpansion)//Событие - открытиеузла

{

DragnDrop=false; //Запрещениеперемещения

TreeView1->Items->BeginUpdate();

tpItem=TreeView1->TopItem; //Сохранение верхнего узла

if(!CheckExpandedChild(Node)) //Если ни один из потомков не расширен

ViewChild(Node);

TreeView1->AlphaSort(); //Сортировка

}

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

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

TTreeNode *Node2, int Data, int &Compare) //Функциясравнения

{

if(Node1->Level==1) //Дляупорядочивания treeview

Compare=Node1->Text[Node1->Text.Length()-2]>Node1->Text[Node1->Text.Length()-2]?1:-1;

else

Compare=Node1->Text.AnsiCompare(Node2->Text);

}

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

void __fastcall TForm1::TreeView1Expanded(TObject *Sender, TTreeNode *Node)

{ //Сообщение об окончании

TTreeNode * temp=TreeView1->TopItem; //Раскрытия списка

TreeView1->TopItem=tpItem; //Проверка выхода конца открытой ветви за экран

if((TreeView1->GetNodeAt(TreeView1->Width/2,TreeView1->ClientHeight-1))!=NULL)

{ //Если это так то сдвигаем всю ветвь вверх автоматом

int p=(TreeView1->GetNodeAt(TreeView1->Width/2,TreeView1->ClientHeight-1))->AbsoluteIndex;

if(p<=Node->GetLastChild()->AbsoluteIndex) TreeView1->TopItem=temp;

} //если нет то ставим первым сохранненый ранее первый элемент

TreeView1->Items->EndUpdate();

DragnDrop=true; //Разрешениеперемещения

}

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

void __fastcall TForm1::TreeView1Collapsing(TObject *Sender,

TTreeNode *Node, bool &AllowCollapse) //Событие - передсвертыванием

{

DragnDrop=false;

TreeView1->Items->BeginUpdate();

if(!CheckExpandedChild(Node)) //Если ветвь ни одного из потомков не расширена

DeleteChild(Node); //Удалениедетейдетей

TreeView1->Items->EndUpdate();

DragnDrop=true;

}

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

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

bool &AllowEdit)

{

if(Node->Level<2) AllowEdit=false; //Запрет на редактирование Мой комп и названий дисков

}

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

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

TListItem *Item2, int Data, int &Compare)

{

bool temp1=false, temp2=false;

if(((FileGetAttr(*((AnsiString *)Item1->Data))) & faDirectory)!=0)

temp1=true;

if(((FileGetAttr(*((AnsiString *)Item2->Data))) & faDirectory)!=0)

temp2=true;

AnsiString s1,s2;

switch(ColumnToSort)

{

case 0:

if(temp1==temp2)

Compare=(Item1->Caption).AnsiCompare(Item2->Caption);

else

Compare=temp2?1:-1;

break;

case 2:

if(temp1==temp2)

Compare=(Item1->SubItems->Strings[1]).AnsiCompare(Item2->SubItems->Strings[1]);

else

Compare=temp2?1:-1;

break;

case 1:

if(temp1) s1="0 ";

else s1= Item1->SubItems->Strings[0];

if(temp2) s2="0 ";

else s2= Item2->SubItems->Strings[0];

s1=s1.SubString(1,s1.Pos(" ")-1);

s2=s2.SubString(1,s2.Pos(" ")-1);

Compare=StrToInt(s1)>StrToInt(s2)?1:-1;

break;

case 3:

TDateTime dt1=StrToDateTime(Item1->SubItems->Strings[2]);

TDateTime dt2=StrToDateTime(Item2->SubItems->Strings[2]);

if(temp1==temp2)

Compare=dt1>dt2?1:-1;

else

Compare=temp2?1:-1;

break;

}

Compare*=Direct;

}

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

void __fastcall TForm1::ListView1DblClick(TObject *Sender)

{ //Двойнойкликна ListView

OpenFileOrFolder();

}

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


void __fastcall TForm1::ListView1MouseDown(TObject *Sender,

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

{

if(DragnDrop && Button == mbLeft) //Событие по нажатию мыши и начало перемещения

{

if(Shift.Contains(ssCtrl))

type_file_operation_drag_drop=FO_COPY;

else

type_file_operation_drag_drop=FO_MOVE;

ListView1->BeginDrag(false,5);

}

}

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

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

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

{ //Процессперетаскивания

Accept=(TreeView1->GetNodeAt(X,Y)!=NULL) && (Source->ClassNameIs("TListView") || Source->ClassNameIs("TTreeView"));

} //Даем возможность положить объект если есть куда класть и объект из list и tree

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

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

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

{

TListItem *p=ListView1->GetItemAt(X,Y);

Accept=(p!=NULL) && ((FileGetAttr(*((AnsiString *)(p->Data))) & faDirectory) !=0) &&

(Source->ClassNameIs("TListView") || Source->ClassNameIs("TTreeView"));

//Даем возможность положить если есть куда если это папка и объект из list или tree

if((StyleListView==vsIcon || StyleListView==vsSmallIcon) && !Accept && p==NULL)

Accept=true;

//в случае значков даем возможность положить значок в пустое место

}

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

void strcat0(char * &dest,char *source)

{ //Объединение двуч строк с оставлением между ними

for(;(*dest)!='&bsol;0';dest++); //нулевогосимвола

for(dest++;(*source!='&bsol;0');dest++,source++)

*dest=*source;

*dest='&bsol;0';

}

void finstr(char *dest)

{

for(;(*dest)!='&bsol;0';dest++);

dest++;

*dest='&bsol;0';

}

unsigned int lengthfinstr(char *dest)

{

unsigned int l=0;

do

{

for(;(*dest)!='&bsol;0';dest++,l++);

dest++;

l++;

}

while((*dest)!='&bsol;0');

return l+1;

}

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

int X, int Y)

{

int operation=type_file_operation_drag_drop;

if(ListView1->GetItemAt(X,Y)==NULL)

{ //Если перенос делается на пустое место

ListView1->Selected->Position=Point(X,Y); //просто меняем место значка и выходим

return;

}

if(Source->ClassNameIs("TListView")) //Если объект перетащен из listview

{ //извлекаем нужные папки и делаем операцию

char *frombuf, tobuf[MAX_PATH+1]={'&bsol;0'};

TListView *sender=(TListView *)Sender;

PrepareBufForOperationInListView(frombuf);

AnsiString senderstr=*((AnsiString *)(sender->GetItemAt(X,Y)->Data));//+ExtractFileName(*((AnsiString *)(source->Selected->Data)));

strcpy(tobuf,senderstr.c_str()); //Вызываем функции и указываем операцию

FileAndFolderOperation(frombuf,tobuf,operation);

}

if(Source->ClassNameIs("TTreeView"))

{

char frombuf[MAX_PATH+1]={'&bsol;0'}, tobuf[MAX_PATH+1]={'&bsol;0'};

TTreeView *source=(TTreeView *)Source;

TListView *sender=(TListView *)Sender;

AnsiString sourcestr=*((AnsiString *)(source->Selected->Data));

AnsiString senderstr=*((AnsiString *)(sender->GetItemAt(X,Y)->Data));//+ExtractFileName(*((AnsiString *)(source->Selected->Data)));

sourcestr.SetLength(sourcestr.Length()-1);

strcpy(frombuf,sourcestr.c_str());

strcpy(tobuf,senderstr.c_str());

FileAndFolderOperation(frombuf,tobuf,operation);

}

UpdateAll(false); //Обновление

}

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

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

int X, int Y) //Окончание перетаскивания

{

int operation=type_file_operation_drag_drop;

if(Source->ClassNameIs("TListView")) //Еслиобъектперетащениз listview

{ //извлекаем нужные папки и делаем операцию

char *frombuf, tobuf[MAX_PATH+1]={'&bsol;0'};

TTreeView *sender=(TTreeView *)Sender;

PrepareBufForOperationInListView(frombuf);

AnsiString senderstr=*((AnsiString *)(sender->GetNodeAt(X,Y)->Data));//+ExtractFileName(*((AnsiString *)(source->Selected->Data)));

strcpy(tobuf,senderstr.c_str()); //Вызываем функции и указываем операцию

FileAndFolderOperation(frombuf,tobuf,operation);

}

if(Source->ClassNameIs("TTreeView"))

{

TTreeView *source=(TTreeView *)Source;

TTreeView *sender=(TTreeView *)Sender;

char frombuf[MAX_PATH+1]={'&bsol;0'}, tobuf[MAX_PATH]={'&bsol;0'};

AnsiString sourcestr=*((AnsiString *)(source->Selected->Data));

AnsiString senderstr=*((AnsiString *)(sender->GetNodeAt(X,Y)->Data));//+ExtractFileName(*((AnsiString *)(source->Selected->Data)));

sourcestr.SetLength(sourcestr.Length()-1);

strcpy(frombuf,sourcestr.c_str());

strcpy(tobuf,senderstr.c_str());

FileAndFolderOperation(frombuf,tobuf,operation);

}

UpdateAll(false); //Обновление

}

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

void __fastcall TForm1::TreeView1MouseDown(TObject *Sender,

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

{

if(DragnDrop && Button == mbLeft) //начало перетаскивания по нажатию на treeview

{

if(Shift.Contains(ssCtrl))

type_file_operation_drag_drop=FO_COPY;

else

type_file_operation_drag_drop=FO_MOVE;

TreeView1->BeginDrag(false,5);

}

}

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

AnsiString &S)

{

S=RenameFileOrFolder(S);

UpdateTreeView(false);

}

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


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

AnsiString &S)

{

S=RenameFileOrFolder(S);

UpdateTreeView(false);

}

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

void __fastcall TForm1::NRenameClick(TObject *Sender)

{

if(ListView1->ItemFocused==NULL)

{

if(TreeView1->Selected!=NULL)

if(TreeView1->Selected->Level>1)

TreeView1->Selected->EditText();

}

else

if((ListView1->Selected)!=NULL)

ListView1->Selected->EditCaption();

}

void __fastcall TForm1::TreeView1ContextPopup(TObject *Sender,