Esempio n. 1
0
void CFolderHelper::DragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept)
{
	TElTree* tv = dynamic_cast<TElTree*>(Sender); VERIFY(Sender);
	TElTreeItem* tgt;

    for (ELVecIt it=drag_items.begin(); it!=drag_items.end(); it++){
        TElTreeItem* src=*it;
        TSTItemPart IP;
        int HCol;
        if (!src) Accept = false;
        else{
            tgt = tv->GetItemAt(X, Y, IP, HCol);
            if (tgt){
                if (IsFolder(src)){
                    bool b = true;
                    for (TElTreeItem* itm=tgt->Parent; itm; itm=itm->Parent) if (itm==src){b=false; break;}
                    if (IsFolder(tgt)){
                        Accept = b&&(tgt!=src)&&(src->Parent!=tgt);
                    }else if (IsObject(tgt)){
                        Accept = b&&(src!=tgt->Parent)&&(tgt!=src)&&(tgt->Parent!=src->Parent);
                    }
                }else if (IsObject(src)){
                    if (IsFolder(tgt)){
                        Accept = (tgt!=src)&&(src->Parent!=tgt);
                    }else if (IsObject(tgt)){
                        Accept = (tgt!=src)&&(src->Parent!=tgt->Parent);
                    }
                }
            }else Accept = !!src->Parent;
        }
        if (false==Accept) return;
    }
}
Esempio n. 2
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;
 }