📄 queueframe.cpp
字号:
tvi.item.lParam = (LPARAM)new string(commonStart);
parent = ctrlDirs.InsertItem(&tvi);
HTREEITEM ht = addDirectory(oldCommon);
HTREEITEM ht2 = ctrlDirs.GetChildItem(next);
while(ht2 != NULL) {
moveNode(ht2, ht);
ht2 = ctrlDirs.GetChildItem(next);
}
delete (string*)ctrlDirs.GetItemData(next);
ctrlDirs.DeleteItem(next);
next = ctrlDirs.GetChildItem(parent);
i = commonStart.length();
}
}
}
while( i < dir.length() ) {
if(next == fileLists) {
next = ctrlDirs.GetNextSiblingItem(next);
}
while(next != NULL) {
const string& n = getDir(next);
if(Util::strnicmp(n.c_str()+i, dir.c_str()+i, n.length()-i) == 0) {
// Found a part, we assume it's the best one we can find...
i = n.length();
parent = next;
next = ctrlDirs.GetChildItem(next);
break;
}
next = ctrlDirs.GetNextSiblingItem(next);
}
if(next == NULL) {
// We didn't find it, add...
j = dir.find('\\', i);
dcassert(j != string::npos);
string name = dir.substr(i, j-i);
tvi.hParent = parent;
tvi.item.pszText = const_cast<char*>(name.c_str());
tvi.item.lParam = (LPARAM) new string(dir.substr(0, j+1));
parent = ctrlDirs.InsertItem(&tvi);
if(directories.find(getDir(parent)) == directories.end()) {
ctrlDirs.Expand(ctrlDirs.GetParentItem(parent), TVE_EXPAND);
}
i = j + 1;
}
}
return parent;
}
void QueueFrame::removeDirectory(const string& dir, bool isFileList /* = false */) {
// First, find the last name available
string::size_type i = 0;
HTREEITEM next = ctrlDirs.GetRootItem();
HTREEITEM parent = NULL;
if(isFileList) {
dcassert(fileLists != NULL);
delete (string*)ctrlDirs.GetItemData(fileLists);
ctrlDirs.DeleteItem(fileLists);
fileLists = NULL;
return;
} else {
while(i < dir.length()) {
while(next != NULL) {
if(next == fileLists) {
next = ctrlDirs.GetNextSiblingItem(next);
continue;
}
const string& n = getDir(next);
if(Util::strnicmp(n.c_str()+i, dir.c_str()+i, n.length()-i) == 0) {
// Match!
parent = next;
next = ctrlDirs.GetChildItem(next);
i = n.length();
break;
}
next = ctrlDirs.GetNextSiblingItem(next);
}
if(next == NULL)
break;
}
}
next = parent;
while((ctrlDirs.GetChildItem(next) == NULL) && (directories.find(getDir(next)) == directories.end())) {
delete (string*)ctrlDirs.GetItemData(next);
parent = ctrlDirs.GetParentItem(next);
ctrlDirs.DeleteItem(next);
if(parent == NULL)
break;
next = parent;
}
}
void QueueFrame::removeDirectories(HTREEITEM ht) {
HTREEITEM next = ctrlDirs.GetChildItem(ht);
while(next != NULL) {
removeDirectories(next);
next = ctrlDirs.GetNextSiblingItem(ht);
}
delete (string*)ctrlDirs.GetItemData(ht);
ctrlDirs.DeleteItem(ht);
}
void QueueFrame::onQueueRemoved(QueueItem* aQI) {
QueueItem* qi = NULL;
{
Lock l(cs);
QueueIter i = queue.find(aQI);
dcassert(i != queue.end());
qi = i->second;
queue.erase(i);
if(!aQI->isSet(QueueItem::FLAG_USER_LIST)) {
queueSize-=aQI->getSize();
dcassert(queueSize >= 0);
}
queueItems--;
dcassert(queueItems >= 0);
dirty = true;
}
speak(REMOVE_ITEM, qi);
}
void QueueFrame::onQueueMoved(QueueItem* aQI) {
QueueItem* qi = NULL;
QueueItem* qi2 = new QueueItem(*aQI);
{
Lock l(cs);
dcassert(queue.find(aQI) != queue.end());
QueueIter i = queue.find(aQI);
qi = i->second;
i->second = qi2;
}
speak(REMOVE_ITEM, qi);
speak(ADD_ITEM, qi2);
}
void QueueFrame::onQueueUpdated(QueueItem* aQI) {
QueueItem* qi = NULL;
{
Lock l(cs);
dcassert(queue.find(aQI) != queue.end());
qi = queue[aQI];
{
for(QueueItem::Source::Iter i = qi->getSources().begin(); i != qi->getSources().end(); ++i) {
delete *i;
}
qi->getSources().clear();
for(QueueItem::Source::Iter j = aQI->getSources().begin(); j != aQI->getSources().end(); ++j) {
qi->getSources().push_back(new QueueItem::Source(*(*j)));
}
}
{
for(QueueItem::Source::Iter i = qi->getBadSources().begin(); i != qi->getBadSources().end(); ++i) {
delete *i;
}
qi->getBadSources().clear();
for(QueueItem::Source::Iter j = aQI->getBadSources().begin(); j != aQI->getBadSources().end(); ++j) {
qi->getBadSources().push_back(new QueueItem::Source(*(*j)));
}
}
qi->setPriority(aQI->getPriority());
qi->setStatus(aQI->getStatus());
}
speak(SET_TEXT, qi);
}
LRESULT QueueFrame::onSpeaker(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) {
Lock l(cs);
spoken = false;
for(TaskIter ti = tasks.begin(); ti != tasks.end(); ++ti) {
if(ti->first == ADD_ITEM) {
QueueItem* qi = (QueueItem*)ti->second;
addQueueItem(qi);
updateStatus();
} else if(ti->first == REMOVE_ITEM) {
QueueItem* qi = (QueueItem*)ti->second;
string dir = Util::getFilePath(qi->getTarget());
if(!showTree || (dir == curDir)) {
dcassert(ctrlQueue.find((LPARAM)qi) != -1);
ctrlQueue.DeleteItem(ctrlQueue.find((LPARAM)qi));
}
pair<DirectoryIter, DirectoryIter> i = directories.equal_range(dir);
DirectoryIter j;
for(j = i.first; j != i.second; ++j) {
if(j->second == qi)
break;
}
dcassert(j != i.second);
directories.erase(j);
if(directories.count(dir) == 0) {
removeDirectory(dir, qi->isSet(QueueItem::FLAG_USER_LIST));
if(curDir == dir)
curDir = Util::emptyString;
}
delete qi;
updateStatus();
setDirty();
} else if(ti->first == SET_TEXT) {
QueueItem* qi = (QueueItem*)ti->second;
string dir = Util::getFilePath(qi->getTarget());
if(!showTree || (dir == curDir) ) {
StringListInfo sli(qi);
int n = ctrlQueue.find((LPARAM)qi);
dcassert(n != -1);
ctrlQueue.SetRedraw(FALSE);
for(int i = 0; i < COLUMN_LAST; i++) {
if(!sli.columns[i].empty()) {
ctrlQueue.SetItemText(n, i, sli.columns[i].c_str());
}
}
ctrlQueue.SetRedraw(TRUE);
}
}
}
if(tasks.size() > 0) {
tasks.clear();
}
return 0;
}
void QueueFrame::moveSelected() {
int n = ctrlQueue.GetSelectedCount();
if(n == 1) {
// Single file, get the full filename and move...
QueueItem* qi = (QueueItem*)ctrlQueue.GetItemData(ctrlQueue.GetNextItem(-1, LVNI_SELECTED));
string name = qi->getTarget();
if(WinUtil::browseFile(name, m_hWnd, true, Util::getFilePath(name))) {
QueueManager::getInstance()->move(qi->getTarget(), name);
}
} else if(n > 1) {
string name;
if(showTree) {
name = curDir;
}
if(WinUtil::browseDirectory(name, m_hWnd)) {
int i = -1;
while( (i = ctrlQueue.GetNextItem(i, LVNI_SELECTED)) != -1) {
QueueItem* qi = (QueueItem*)ctrlQueue.GetItemData(i);
QueueManager::getInstance()->move(qi->getTarget(), name + qi->getTargetFileName());
}
}
}
}
void QueueFrame::moveSelectedDir() {
if(ctrlDirs.GetSelectedItem() == NULL)
return;
dcassert(!curDir.empty());
string name = curDir;
if(WinUtil::browseDirectory(name, m_hWnd)) {
moveDir(ctrlDirs.GetSelectedItem(), name);
}
}
void QueueFrame::moveDir(HTREEITEM ht, const string& target) {
HTREEITEM next = ctrlDirs.GetChildItem(ht);
while(next != NULL) {
moveDir(next, target);
next = ctrlDirs.GetNextSiblingItem(next);
}
string* s = (string*)ctrlDirs.GetItemData(ht);
string name = target + s->substr(curDir.length());
DirectoryPair p = directories.equal_range(*s);
for(DirectoryIter i = p.first; i != p.second; ++i) {
QueueItem* qi = i->second;
QueueManager::getInstance()->move(qi->getTarget(), name + qi->getTargetFileName());
}
}
LRESULT QueueFrame::onContextMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) {
RECT rc; // client area of window
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; // location of mouse click
// Get the bounding rectangle of the client area.
ctrlQueue.GetClientRect(&rc);
ctrlQueue.ScreenToClient(&pt);
if (PtInRect(&rc, pt) && ctrlQueue.GetSelectedCount() > 0) {
usingDirMenu = false;
CMenuItemInfo mi;
while(browseMenu.GetMenuItemCount() > 0) {
browseMenu.RemoveMenu(0, MF_BYPOSITION);
}
while(removeMenu.GetMenuItemCount() > 0) {
removeMenu.RemoveMenu(0, MF_BYPOSITION);
}
while(pmMenu.GetMenuItemCount() > 0) {
pmMenu.RemoveMenu(0, MF_BYPOSITION);
}
while(readdMenu.GetMenuItemCount() > 0) {
readdMenu.RemoveMenu(0, MF_BYPOSITION);
}
ctrlQueue.ClientToScreen(&pt);
if(ctrlQueue.GetSelectedCount() == 1) {
LVITEM lvi;
lvi.iItem = ctrlQueue.GetNextItem(-1, LVNI_SELECTED);
lvi.iSubItem = 0;
lvi.mask = LVIF_IMAGE | LVIF_PARAM;
ctrlQueue.GetItem(&lvi);
menuItems = 0;
QueueItem::Source::Iter i;
QueueItem* q = (QueueItem*)lvi.lParam;
for(i = q->getSources().begin(); i != q->getSources().end(); ++i) {
mi.fMask = MIIM_ID | MIIM_TYPE | MIIM_DATA;
mi.fType = MFT_STRING;
mi.dwTypeData = (LPSTR)(*i)->getUser()->getNick().c_str();
mi.dwItemData = (DWORD)*i;
mi.wID = IDC_BROWSELIST + menuItems;
browseMenu.InsertMenuItem(menuItems, TRUE, &mi);
mi.wID = IDC_REMOVE_SOURCE + menuItems;
removeMenu.InsertMenuItem(menuItems, TRUE, &mi);
if((*i)->getUser()->isOnline()) {
mi.wID = IDC_PM + menuItems;
pmMenu.InsertMenuItem(menuItems, TRUE, &mi);
}
menuItems++;
}
readdItems = 0;
for(i = q->getBadSources().begin(); i != q->getBadSources().end(); ++i) {
mi.fMask = MIIM_ID | MIIM_TYPE | MIIM_DATA;
mi.fType = MFT_STRING;
mi.dwTypeData = (LPSTR)(*i)->getUser()->getNick().c_str();
mi.dwItemData = (DWORD)*i;
mi.wID = IDC_READD + readdItems;
readdMenu.InsertMenuItem(readdItems, TRUE, &mi);
readdItems++;
}
singleMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, m_hWnd);
} else {
multiMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, m_hWnd);
}
return TRUE;
}
ctrlQueue.ClientToScreen(&pt);
ctrlDirs.GetClientRect(&rc);
ctrlDirs.ScreenToClient(&pt);
if (PtInRect(&rc, pt) && ctrlDirs.GetSelectedItem() != NULL) {
usingDirMenu = true;
// Strange, windows doesn't change the selection on right-click... (!)
UINT a = 0;
HTREEITEM ht = ctrlDirs.HitTest(pt, &a);
if(ht != NULL && ht != ctrlDirs.GetSelectedItem())
ctrlDirs.SelectItem(ht);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -