📄 queuectrl.cpp
字号:
if (apiiter->bActive)
continue; //Skip active instances
if (apiiter->pTransferApi->IsConnected() == FZ_REPLY_OK)
{
t_server server;
if (apiiter->pTransferApi->GetCurrentServer(server)==FZ_REPLY_OK)
if (server == iter->transferFile.server)
{
nMatchingApiIndex = apiiter - m_TransferApiArray.begin();
break;
}
else
nConnectedApiIndex = apiiter - m_TransferApiArray.begin();
else
nUnconnectedApiIndex = apiiter - m_TransferApiArray.begin();
}
else
nUnconnectedApiIndex = apiiter - m_TransferApiArray.begin();
}
nApiIndex = -1;
if (nMatchingApiIndex != -1)
nApiIndex = nMatchingApiIndex;
else if (!m_RetryServerList.StillWait(iter->transferFile.server))
if (nUnconnectedApiIndex != -1)
nApiIndex = nUnconnectedApiIndex;
else
nApiIndex = nConnectedApiIndex;
if (nApiIndex == -1)
continue;
api = m_TransferApiArray[nApiIndex];
if (api.pLastActiveTime)
delete api.pLastActiveTime;
api.pLastActiveTime = 0;
api.bActive = TRUE;
m_TransferApiArray[nApiIndex] = api;
iter->status.Format(IDS_QUEUESTATUS_TRANSFERRING);
iter->bActive = TRUE;
//Create the progress control
iter->pProgressControl = new CTextProgressCtrl;
if (iter->pProgressControl->Create(WS_VISIBLE|WS_CHILD|WS_BORDER, CRect(1, 1, 1, 1), this, 0))
{
iter->pProgressControl->SetRange(0,100); //Set the range to between 0 and 100
iter->pProgressControl->SetStep(1); // Set the step amount
iter->pProgressControl->ShowWindow(SW_HIDE);
}
else
{
delete iter->pProgressControl;
iter->pProgressControl = NULL;
}
const CQueueData queueData = *iter;
m_QueueItems.erase(iter);
iter = m_QueueItems.insert(m_QueueItems.begin() + m_nActiveCount, queueData);
m_nActiveCount++;
SetItemCount(m_QueueItems.size() + m_nActiveCount);
iter->pTransferApi = api.pTransferApi;
if (api.pTransferApi->IsConnected() == FZ_REPLY_OK)
{
t_server server;
if (api.pTransferApi->GetCurrentServer(server) == FZ_REPLY_OK)
{
if (server== iter->transferFile.server)
{
iter->nState = QUEUESTATE_TRANSFER;
int res = api.pTransferApi->FileTransfer(iter->transferFile);
if (res == FZ_REPLY_WOULDBLOCK)
{
iter->status.Format(IDS_QUEUESTATUS_TRANSFERRING);
ServerDataMapIter->second.nCurrentActive++;
if (ServerDataMapIter->second.nCurrentActive>ServerDataMapIter->second.nActiveMax)
ServerDataMapIter->second.nActiveMax++;
return 1;
}
else if (res!=FZ_REPLY_NOTCONNECTED)
return -2;
}
else
{
iter->nState = QUEUESTATE_DISCONNECT;
int res = api.pTransferApi->Disconnect();
if (res == FZ_REPLY_WOULDBLOCK)
{
iter->status.Format(IDS_STATUSMSG_CONNECTING, (iter->transferFile.server.name!="")?iter->transferFile.server.name:iter->transferFile.server.host);
return 1;
}
else if (res!=FZ_REPLY_NOTCONNECTED)
return -2;
}
}
}
iter->nState = QUEUESTATE_CONNECT;
if (api.pTransferApi->Connect(iter->transferFile.server) != FZ_REPLY_WOULDBLOCK)
return -2;
iter->status.Format(IDS_STATUSMSG_CONNECTING, (iter->transferFile.server.name!="")?iter->transferFile.server.name:iter->transferFile.server.host);
return 1;
}
return 0;
}
void CQueueCtrl::OnContextMenu(CWnd* pWnd, CPoint point)
{
CMenu menu;
menu.LoadMenu(IDR_QUEUECONTEXTMENU);
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CWnd* pWndPopupOwner = this;
BOOL selected = FALSE;
for (t_QueueVector::iterator iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
{
if (!(iter->nListItemState & LVIS_SELECTED))
continue;
if (!selected)
selected = TRUE;
int nIndex = iter - m_QueueItems.begin();
if (nIndex < m_nActiveCount)
{
pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVETOTOP, MF_GRAYED);
pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVETOBOTTOM, MF_GRAYED);
pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVEUP, MF_GRAYED);
pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVEDOWN, MF_GRAYED);
pPopup->EnableMenuItem(ID_QUEUECONTEXT_REMOVEFROMQUEUE, MF_GRAYED);
}
if (nIndex >= FindValidIndex(1)-m_QueueItems.begin())
{
pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVETOTOP, MF_GRAYED);
pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVETOBOTTOM, MF_GRAYED);
pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVEUP, MF_GRAYED);
pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVEDOWN, MF_GRAYED);
}
if (nIndex==(FindValidIndex(1)-m_QueueItems.begin()-1))
{
pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVEDOWN, MF_GRAYED);
}
if (nIndex == m_nActiveCount)
{
pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVEUP, MF_GRAYED);
}
if (!iter->priority)
pPopup->EnableMenuItem(ID_QUEUECONTEXT_PAUSE, MF_GRAYED);
if (!iter->bPaused)
pPopup->EnableMenuItem(ID_QUEUECONTEXT_RESUME, MF_GRAYED);
if (iter->priority || iter->bPaused)
pPopup->EnableMenuItem(ID_QUEUECONTEXT_RESETSTATUS, MF_GRAYED);
if (iter->priority==1 && nIndex == FindValidIndex(2)-m_QueueItems.begin())
{
pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVEUP, MF_GRAYED);
}
if (iter->priority==2 && nIndex == (FindValidIndex(2)-m_QueueItems.begin()-1))
{
pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVEDOWN, MF_GRAYED);
}
}
if (!selected)
{
pPopup->EnableMenuItem(ID_QUEUECONTEXT_PROCESSQUEUE, MF_GRAYED);
pPopup->EnableMenuItem(ID_QUEUECONTEXT_REMOVEFROMQUEUE, MF_GRAYED);
pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVETOTOP, MF_GRAYED);
pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVETOBOTTOM, MF_GRAYED);
pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVEUP, MF_GRAYED);
pPopup->EnableMenuItem(ID_QUEUECONTEXT_MOVEDOWN, MF_GRAYED);
pPopup->EnableMenuItem(ID_QUEUECONTEXT_RESETSTATUS, MF_GRAYED);
pPopup->EnableMenuItem(ID_QUEUECONTEXT_PAUSE, MF_GRAYED);
pPopup->EnableMenuItem(ID_QUEUECONTEXT_RESUME, MF_GRAYED);
pPopup->EnableMenuItem(ID_QUEUECONTEXT_ABORT, MF_GRAYED);
}
else
if (FindValidIndex(1) == m_QueueItems.begin())
pPopup->EnableMenuItem(ID_QUEUECONTEXT_PROCESSQUEUE, MF_GRAYED);
if (DoProcessQueue()==1 || m_QueueItems.empty())
pPopup->EnableMenuItem(ID_QUEUECONTEXT_PROCESSQUEUE, MF_GRAYED);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
pWndPopupOwner);
}
void CQueueCtrl::OnQueuecontextMovedown()
{
std::list<int> list;
for (t_QueueVector::iterator iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
{
if (!(iter->nListItemState & LVIS_SELECTED))
continue;
int nIndex = iter - m_QueueItems.begin();
if (iter->bActive)
continue;
if (iter->priority==1 && nIndex>=(FindValidIndex(1) - m_QueueItems.begin() - 1))
continue;
if (iter->priority==2 && nIndex>=(FindValidIndex(2) - m_QueueItems.begin() - 1))
continue;
if (nIndex >= FindValidIndex(1) - m_QueueItems.begin())
continue;
list.push_front(nIndex);
}
for (std::list<int>::iterator listiter = list.begin(); listiter != list.end(); listiter++)
{
CQueueData data = m_QueueItems[*listiter];
m_QueueItems[*listiter] = m_QueueItems[*listiter + 1];
m_QueueItems[*listiter + 1] = data;
}
RedrawItems(0, GetItemCount() - 1);
}
void CQueueCtrl::OnQueuecontextMovetobottom()
{
std::list<int> list;
for (t_QueueVector::iterator iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
{
if (!(iter->nListItemState & LVIS_SELECTED))
continue;
int nIndex = iter - m_QueueItems.begin();
if (iter->bActive)
continue;
if (nIndex >= FindValidIndex(1) - m_QueueItems.begin())
continue;
list.push_front(nIndex);
}
int offset2=0;
int offset=0;
for (std::list<int>::iterator listiter=list.begin(); listiter!=list.end(); listiter++)
{
CQueueData data = m_QueueItems[*listiter];
m_QueueItems.erase(m_QueueItems.begin() + *listiter);
if (data.priority==1)
m_QueueItems.insert(FindValidIndex(1) - offset++, data);
else
m_QueueItems.insert(FindValidIndex(2) - offset2++, data);
}
SetItemCount(m_QueueItems.size() + m_nActiveCount);
}
void CQueueCtrl::OnQueuecontextMovetotop()
{
std::list<int> list;
for (t_QueueVector::iterator iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
{
if (!(iter->nListItemState & LVIS_SELECTED))
continue;
int nIndex = iter - m_QueueItems.begin();
if (iter->bActive)
continue;
if (nIndex >= FindValidIndex(1) - m_QueueItems.begin())
continue;
list.push_back(nIndex);
}
int offset = FindValidIndex(2) - m_QueueItems.begin();
int offset2 = m_nActiveCount;
for (std::list<int>::iterator listiter=list.begin(); listiter!=list.end(); listiter++)
{
CQueueData data = m_QueueItems[*listiter];
m_QueueItems.erase(m_QueueItems.begin() + *listiter);
if (data.priority==1)
m_QueueItems.insert(m_QueueItems.begin() + offset++, data);
else
m_QueueItems.insert(m_QueueItems.begin() + offset2++, data);
}
SetItemCount(m_QueueItems.size() + m_nActiveCount);
}
void CQueueCtrl::OnQueuecontextMoveup()
{
std::list<int> list;
for (t_QueueVector::iterator iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
{
if (!(iter->nListItemState & LVIS_SELECTED))
continue;
int nIndex = iter - m_QueueItems.begin();
if (iter->bActive)
continue;
if (nIndex <= m_nActiveCount)
continue;
if (iter->priority == 1 && nIndex == FindValidIndex(2) - m_QueueItems.begin())
continue;
if (nIndex >= FindValidIndex(1) - m_QueueItems.begin())
continue;
if (nIndex == 1)
m_bMayUsePrimaryConnection = FALSE;
list.push_back(nIndex);
}
for (std::list<int>::iterator listiter = list.begin(); listiter != list.end(); listiter++)
{
CQueueData data = m_QueueItems[*listiter];
m_QueueItems[*listiter] = m_QueueItems[*listiter - 1];
m_QueueItems[*listiter - 1] = data;
}
SetItemCount(m_QueueItems.size() + m_nActiveCount);
}
void CQueueCtrl::OnQueuecontextProcessqueue()
{
CMainFrame *pMainFrame = DYNAMIC_DOWNCAST(CMainFrame, GetParentFrame());
pMainFrame->TransferQueue(1);
}
void CQueueCtrl::OnQueuecontextRemovefromqueue()
{
std::list<int> list;
for (t_QueueVector::iterator iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
{
if (!(iter->nListItemState & LVIS_SELECTED))
continue;
if (iter == m_QueueItems.begin())
m_bMayUsePrimaryConnection = FALSE;
if (iter->bActive)
continue;
list.push_front(iter - m_QueueItems.begin());
}
for (std::list<int>::iterator listiter=list.begin(); listiter!=list.end(); listiter++)
m_QueueItems.erase(m_QueueItems.begin() + *listiter);
SetItemCount(m_QueueItems.size() + m_nActiveCount);
UpdateStatusbar();
}
t_QueueVector::iterator CQueueCtrl::FindValidIndex(int type)
{
t_QueueVector::iterator iter = m_QueueItems.end();
if (type == 1)
{
for (iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
if (iter->priority == 0)
break;
}
else if (type == 2)
for (iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
if (!iter->bActive && iter->priority != 2)
break;
return iter;
}
t_QueueVector::const_iterator CQueueCtrl::FindValidIndex(int type) const
{
t_QueueVector::const_iterator iter = m_QueueItems.end();
if (type == 1)
for (iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
if (iter->priority == 0)
break;
else if (type == 2)
for (iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
if (!iter->bActive)
break;
return iter;
}
void CQueueCtrl::OnQueuecontextResetstatus()
{
std::list<int> list;
std::list<CQueueData> list2;
for (t_QueueVector::iterator iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
{
if (!(iter->nListItemState & LVIS_SELECTED))
continue;
int nIndex = iter - m_QueueItems.begin();
if (iter->priority || iter->bPaused)
continue;
list.push_front(nIndex);
list2.push_front(m_QueueItems[nIndex]);
}
for (std::list<int>::iterator listiter=list.begin(); listiter!=list.end(); listiter++)
m_QueueItems.erase(m_QueueItems.begin() + *listiter);
for (std::list<CQueueData>::iterator iter2=list2.begin(); iter2!=list2.end(); iter2++)
{
iter2->action = "";
iter2->retrycount = 0;
iter2->bTransferStarted = FALSE;
AddItem(*iter2);
}
UpdateStatusbar();
}
#define VK_A 65
void CQueueCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar==46)
OnQueuecontextRemovefromqueue();
else if(GetKeyState( VK_CONTROL )&128 && nChar == VK_A )
{
for (t_QueueVector::iterator iter = m_QueueItems.begin(); iter != m_QueueItems.end(); iter++)
iter->nListItemState = LVIS_SELECTED;
RedrawItems(0, GetItemCount() - 1);
return;
}
CListCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CQueueCtrl::ReloadHeader()
{
ReloadHeaderItem(0, IDS_HEADER_LOCALNAME);
ReloadHeaderItem(1, IDS_HEADER_SIZE);
ReloadHeaderItem(2, IDS_HEADER_DIRECTION);
ReloadHeaderItem(3, IDS_HEADER_REMOTENAME);
ReloadHeaderItem(4, IDS_HEADER_HOST);
ReloadHeaderItem(5, IDS_HEADER_STATUS);
}
void CQueueCtrl::ReloadHeaderItem(int nIndex, UINT nID)
{
CHeaderCtrl *header = GetHeaderCtrl();
TCHAR text[100];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -