bool wxGISToolExecuteView::OnDropObjects(wxCoord x, wxCoord y, long nParentPointer, const wxArrayLong& TaskIds)
{
    wxBusyCursor wait;
    SetItemState(m_HighLightItem, 0, wxLIST_STATE_DROPHILITED);
    //SetItemState(m_HighLightItem, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED);

    if(nParentPointer != wxThread::GetMainId())
        return false;

    wxPoint pt(x, y);
    unsigned long nFlags(0);
    long nItemId = HitTest(pt, (int &)nFlags);
    long nObjectID(m_nParentGxObjectId);

    if(nItemId == wxNOT_FOUND)
        return false;

    IGxTask* pBeforeTask(NULL);
    int nInsertPoint = GetItemCount() - TaskIds.GetCount(); //the end
    if(nFlags & wxLIST_HITTEST_ONITEM)
    {
        nInsertPoint = nItemId;// - 1;
        pBeforeTask = dynamic_cast<IGxTask*>(m_pCatalog->GetRegisterObject(GetItemData(nInsertPoint)));
    }

    //1. Read all items to map sortig using priority, but not adding moving items
    m_bDropping = true;
    std::map<long, IGxTask*> ItemsMap;
    for(int i = 0; i < GetItemCount(); ++i)
    {
        long nTaskId = GetItemData(i);
        if(TaskIds.Index(nTaskId) == wxNOT_FOUND)
        {
            IGxTask* pTask = dynamic_cast<IGxTask*>(m_pCatalog->GetRegisterObject(nTaskId));
            if(pTask && pTask->GetState() != enumGISTaskDone)
            {
                ItemsMap[pTask->GetPriority()] = pTask;
            }
        }
    }

    //wxWindowUpdateLocker noUpdates(this);

    //get min priority
    if(nInsertPoint < 0)
    {
        long nMinPrio = ItemsMap.begin()->first;
        for(size_t i = 0; i < TaskIds.GetCount(); ++i)
        {
            IGxTask* pTask = dynamic_cast<IGxTask*>(m_pCatalog->GetRegisterObject(TaskIds[i]));
            if(pTask)
            {
                pTask->SetPriority(++nMinPrio);
            }
        }
        for(std::map<long, IGxTask*>::iterator it = ItemsMap.begin(); it != ItemsMap.end(); ++it)
        {
            it->second->SetPriority(++nMinPrio);
        }
    }
    else if(nInsertPoint >= TaskIds.GetCount())
    {
        long nMinPrio = ItemsMap.begin()->first;
        for(std::map<long, IGxTask*>::iterator it = ItemsMap.begin(); it != ItemsMap.end(); ++it)
        {
            it->second->SetPriority(++nMinPrio);
        }

        for(size_t i = 0; i < TaskIds.GetCount(); ++i)
        {
            IGxTask* pTask = dynamic_cast<IGxTask*>(m_pCatalog->GetRegisterObject(TaskIds[i]));
            if(pTask)
            {
                pTask->SetPriority(++nMinPrio);
            }
        }
    }
    else
    {
        //2. Read from map until end for insert to array
        bool bSetPrio(false);
        long nMinPrio = wxNOT_FOUND;
        for(std::map<long, IGxTask*>::iterator it = ItemsMap.begin(); it != ItemsMap.end(); ++it)
        {
            if(pBeforeTask == it->second)
            {
                nMinPrio = pBeforeTask->GetPriority();
                for(size_t i = 0; i < TaskIds.GetCount(); ++i)
                {
                    IGxTask* pTask = dynamic_cast<IGxTask*>(m_pCatalog->GetRegisterObject(TaskIds[i]));
                    if(pTask)
                    {
                        pTask->SetPriority(++nMinPrio);
                    }
                }
                bSetPrio = true;
            }
            if(bSetPrio)
                it->second->SetPriority(++nMinPrio);
        }
    }

    SortItems(GxTaskCompareFunction, 0);

    m_bDropping = false;

    return true;
}