コード例 #1
0
ファイル: FolderLib.cpp プロジェクト: OLR-xray/OLR-3.0
//---------------------------------------------------------------------------
// Drag'n'Drop
//---------------------------------------------------------------------------
void CFolderHelper::DragDrop(TObject *Sender, TObject* Source, int X, int Y, TOnItemRename after_drag)
{
	R_ASSERT(after_drag);

	TElTree* tv = dynamic_cast<TElTree*>(Sender); VERIFY(tv);

    tv->IsUpdating = true;
    
    TSTItemPart IP=(TSTItemPart)0;
    int 		hc=0;
	TElTreeItem* tgt_folder = tv->GetItemAt(X, Y, IP, hc);
    if (tgt_folder&&(IsObject(tgt_folder))) tgt_folder=tgt_folder->Parent;

    AnsiString base_name;
    MakeName(tgt_folder,0,base_name,true);
    AnsiString cur_fld_name=base_name;
    TElTreeItem* cur_folder=tgt_folder;

//..FS.lock_rescan();
    for (ELVecIt it=drag_items.begin(); it!=drag_items.end(); it++){
        TElTreeItem* item 	= *it;
        int drg_level		= item->Level;

        bool bFolderMove	= IsFolder(item);

        do{
            // проверяем есть ли в таргете такой элемент
            EItemType type 	= EItemType(item->Data);
            TElTreeItem* pNode = FindItemInFolder(type,tv,cur_folder,item->Text);
            if (pNode&&IsObject(item)){
                Msg			("#!Item '%s' already exist in folder '%s'.",AnsiString(item->Text).c_str(),AnsiString(cur_folder->Text).c_str());
                item		= item->GetNext();
                continue;
            }
            // если нет добавляем
            if (!pNode){ 
                pNode 				= (type==TYPE_FOLDER)?LL_CreateFolder(tv,cur_folder,item->Text,item->ForceButtons):LL_CreateObject(tv,cur_folder,item->Text);
                if (type==TYPE_OBJECT) pNode->Assign(item);
            }
            if (IsFolder(item)){
                cur_folder 			= pNode;
                MakeName			(cur_folder,0,cur_fld_name,true);
                item				= item->GetNext();
            }else{
                // rename
                AnsiString old_name, new_name;
                MakeName			(item,0,old_name,false);
                MakeName			(pNode,0,new_name,false);

                after_drag			(old_name.c_str(),new_name.c_str(),TYPE_OBJECT);

                TElTreeItem* parent	= item->Parent;
                // get next item && delete existence
                TElTreeItem* next	= item->GetNext();
                item->Delete		();

                if (parent&&((parent->GetLastChild()==item)||(0==parent->ChildrenCount))){
    //	            if (0==parent->ChildrenCount) parent->Delete();
                    cur_folder = cur_folder?cur_folder->Parent:0;
                }

                item=next;
            }
        }while(item&&(item->Level>drg_level));
        // delete folders
        if (bFolderMove){
            AnsiString 		old_name;
            MakeName		(*it,0,old_name,false);
            after_drag		(old_name.c_str(),0,TYPE_FOLDER);
            (*it)->Delete	();
        }
    }
//..FS.unlock_rescan();

    tv->IsUpdating = false;
 }