📄 queueframe.cpp
字号:
ctrlDirs.ClientToScreen(&pt);
dirMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, m_hWnd);
return TRUE;
}
return FALSE;
}
LRESULT QueueFrame::onSearchAlternates(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(ctrlQueue.GetSelectedCount() == 1) {
string tmp;
int i = ctrlQueue.GetNextItem(-1, LVNI_SELECTED);
QueueItem* qi = (QueueItem*)ctrlQueue.GetItemData(i);
StringList tok = StringTokenizer(SearchManager::clean(qi->getTargetFileName()), ' ').getTokens();
for(StringIter si = tok.begin(); si != tok.end(); ++si) {
bool found = false;
for(StringIter j = searchFilter.begin(); j != searchFilter.end(); ++j) {
if(Util::stricmp(si->c_str(), j->c_str()) == 0) {
found = true;
}
}
if(!found && !si->empty()) {
tmp += *si + ' ';
}
}
if(!tmp.empty()) {
SearchFrame* pChild = new SearchFrame();
pChild->setTab(getTab());
bool bigFile = (qi->getSize() > 10*1024*1024);
if(bigFile) {
pChild->setInitial(tmp, qi->getSize()-1, SearchManager::SIZE_ATLEAST, ShareManager::getInstance()->getType(qi->getTargetFileName()));
} else {
pChild->setInitial(tmp, qi->getSize()+1, SearchManager::SIZE_ATMOST, ShareManager::getInstance()->getType(qi->getTargetFileName()));
}
pChild->CreateEx(m_hWndMDIClient);
}
}
return 0;
}
LRESULT QueueFrame::onBrowseList(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(ctrlQueue.GetSelectedCount() == 1) {
CMenuItemInfo mi;
mi.fMask = MIIM_DATA;
browseMenu.GetMenuItemInfo(wID, FALSE, &mi);
QueueItem::Source* s = (QueueItem::Source*)mi.dwItemData;
try {
QueueManager::getInstance()->addList(s->getUser());
} catch(const Exception&) {
}
}
return 0;
}
LRESULT QueueFrame::onReadd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(ctrlQueue.GetSelectedCount() == 1) {
int i = ctrlQueue.GetNextItem(-1, LVNI_SELECTED);
QueueItem* q = (QueueItem*)ctrlQueue.GetItemData(i);
CMenuItemInfo mi;
mi.fMask = MIIM_DATA;
readdMenu.GetMenuItemInfo(wID, FALSE, &mi);
QueueItem::Source* s = (QueueItem::Source*)mi.dwItemData;
try {
QueueManager::getInstance()->add(s->getPath(), q->getSize(), s->getUser(), q->getTarget());
} catch(const Exception& e) {
ctrlStatus.SetText(0, e.getError().c_str());
}
}
return 0;
}
LRESULT QueueFrame::onRemoveSource(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(ctrlQueue.GetSelectedCount() == 1) {
int i = ctrlQueue.GetNextItem(-1, LVNI_SELECTED);
QueueItem* q = (QueueItem*)ctrlQueue.GetItemData(i);
CMenuItemInfo mi;
mi.fMask = MIIM_DATA;
removeMenu.GetMenuItemInfo(wID, FALSE, &mi);
QueueItem::Source* s = (QueueItem::Source*)mi.dwItemData;
QueueManager::getInstance()->removeSource(q->getTarget(), s->getUser(), QueueItem::Source::FLAG_REMOVED);
}
return 0;
}
LRESULT QueueFrame::onPM(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
if(ctrlQueue.GetSelectedCount() == 1) {
CMenuItemInfo mi;
mi.fMask = MIIM_DATA;
pmMenu.GetMenuItemInfo(wID, FALSE, &mi);
QueueItem::Source* s = (QueueItem::Source*)mi.dwItemData;
PrivateFrame::openWindow(s->getUser(), m_hWndMDIClient, getTab());
}
return 0;
}
LRESULT QueueFrame::onPriority(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) {
QueueItem::Priority p;
switch(wID) {
case IDC_PRIORITY_PAUSED: p = QueueItem::PAUSED; break;
case IDC_PRIORITY_LOWEST: p = QueueItem::LOWEST; break;
case IDC_PRIORITY_LOW: p = QueueItem::LOW; break;
case IDC_PRIORITY_NORMAL: p = QueueItem::NORMAL; break;
case IDC_PRIORITY_HIGH: p = QueueItem::HIGH; break;
case IDC_PRIORITY_HIGHEST: p = QueueItem::HIGHEST; break;
default: p = QueueItem::DEFAULT; break;
}
if(usingDirMenu) {
setPriority(ctrlDirs.GetSelectedItem(), p);
} else {
int i = -1;
while( (i = ctrlQueue.GetNextItem(i, LVNI_SELECTED)) != -1) {
QueueManager::getInstance()->setPriority(((QueueItem*)ctrlQueue.GetItemData(i))->getTarget(), p);
}
}
return 0;
}
void QueueFrame::removeDir(HTREEITEM ht) {
if(ht == NULL)
return;
HTREEITEM child = ctrlDirs.GetChildItem(ht);
while(child) {
removeDir(child);
child = ctrlDirs.GetNextSiblingItem(child);
}
const string& name = getDir(ht);
DirectoryPair dp = directories.equal_range(name);
for(DirectoryIter i = dp.first; i != dp.second; ++i) {
QueueManager::getInstance()->remove(i->second->getTarget());
}
}
void QueueFrame::setPriority(HTREEITEM ht, const QueueItem::Priority& p) {
if(ht == NULL)
return;
HTREEITEM child = ctrlDirs.GetChildItem(ht);
while(child) {
setPriority(child, p);
child = ctrlDirs.GetNextSiblingItem(child);
}
string name = getDir(ht);
DirectoryPair dp = directories.equal_range(name);
for(DirectoryIter i = dp.first; i != dp.second; ++i) {
QueueManager::getInstance()->setPriority(i->second->getTarget(), p);
}
}
void QueueFrame::updateStatus() {
if(ctrlStatus.IsWindow()) {
int64_t total = 0;
int cnt = ctrlQueue.GetSelectedCount();
if(cnt == 0) {
cnt = ctrlQueue.GetItemCount();
if(showTree) {
for(int i = 0; i < cnt; ++i) {
QueueItem* qi = (QueueItem*)ctrlQueue.GetItemData(i);
total += (qi->getSize() > 0) ? qi->getSize() : 0;
}
} else {
total = queueSize;
}
} else {
int i = -1;
while( (i = ctrlQueue.GetNextItem(i, LVNI_SELECTED)) != -1) {
QueueItem* qi = (QueueItem*)ctrlQueue.GetItemData(i);
total += (qi->getSize() > 0) ? qi->getSize() : 0;
}
}
string tmp1 = STRING(ITEMS) + ": " + Util::toString(cnt);
string tmp2 = STRING(SIZE) + ": " + Util::formatBytes(total);
bool u = false;
int w = WinUtil::getTextWidth(tmp1, ctrlStatus.m_hWnd);
if(statusSizes[1] < w) {
statusSizes[1] = w;
u = true;
}
ctrlStatus.SetText(2, tmp1.c_str());
w = WinUtil::getTextWidth(tmp2, ctrlStatus.m_hWnd);
if(statusSizes[2] < w) {
statusSizes[2] = w;
u = true;
}
ctrlStatus.SetText(3, tmp2.c_str());
if(dirty) {
tmp1 = STRING(FILES) + ": " + Util::toString(queueItems);
tmp2 = STRING(SIZE) + ": " + Util::formatBytes(queueSize);
w = WinUtil::getTextWidth(tmp2, ctrlStatus.m_hWnd);
if(statusSizes[3] < w) {
statusSizes[3] = w;
u = true;
}
ctrlStatus.SetText(4, tmp1.c_str());
w = WinUtil::getTextWidth(tmp2, ctrlStatus.m_hWnd);
if(statusSizes[4] < w) {
statusSizes[4] = w;
u = true;
}
ctrlStatus.SetText(5, tmp2.c_str());
dirty = false;
}
if(u)
UpdateLayout(TRUE);
}
}
void QueueFrame::UpdateLayout(BOOL bResizeBars /* = TRUE */) {
RECT rect;
GetClientRect(&rect);
// position bars and offset their dimensions
UpdateBarsPosition(rect, bResizeBars);
if(ctrlStatus.IsWindow()) {
CRect sr;
int w[6];
ctrlStatus.GetClientRect(sr);
w[5] = sr.right - 16;
#define setw(x) w[x] = max(w[x+1] - statusSizes[x], 0)
setw(4); setw(3); setw(2); setw(1);
w[0] = 16;
ctrlStatus.SetParts(6, w);
ctrlStatus.GetRect(0, sr);
ctrlShowTree.MoveWindow(sr);
}
if(showTree) {
if(GetSinglePaneMode() != SPLIT_PANE_NONE) {
SetSinglePaneMode(SPLIT_PANE_NONE);
updateQueue();
}
} else {
if(GetSinglePaneMode() != SPLIT_PANE_RIGHT) {
SetSinglePaneMode(SPLIT_PANE_RIGHT);
updateQueue();
}
}
CRect rc = rect;
SetSplitterRect(rc);
}
LRESULT QueueFrame::onClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) {
if(!closed) {
QueueManager::getInstance()->removeListener(this);
closed = true;
PostMessage(WM_CLOSE);
return 0;
} else {
QueueFrame::frame = NULL;
HTREEITEM ht = ctrlDirs.GetRootItem();
while(ht != NULL) {
clearTree(ht);
ht = ctrlDirs.GetNextSiblingItem(ht);
}
SettingsManager::getInstance()->set(SettingsManager::QUEUEFRAME_SHOW_TREE, ctrlShowTree.GetCheck() == BST_CHECKED);
{
Lock l(cs);
for(QueueIter i = queue.begin(); i != queue.end(); ++i) {
delete i->second;
}
queue.clear();
}
ctrlQueue.DeleteAllItems();
WinUtil::saveHeaderOrder(ctrlQueue, SettingsManager::QUEUEFRAME_ORDER,
SettingsManager::QUEUEFRAME_WIDTHS, COLUMN_LAST, columnIndexes, columnSizes);
MDIDestroy(m_hWnd);
return 0;
}
}
LRESULT QueueFrame::onItemChanged(int /*idCtrl*/, LPNMHDR /* pnmh */, BOOL& /*bHandled*/) {
updateQueue();
return 0;
}
void QueueFrame::updateQueue() {
Lock l(cs);
ctrlQueue.DeleteAllItems();
pair<DirectoryIter, DirectoryIter> i;
if(showTree) {
i = directories.equal_range(getSelectedDir());
} else {
i.first = directories.begin();
i.second = directories.end();
}
ctrlQueue.SetRedraw(FALSE);
for(DirectoryIter j = i.first; j != i.second; ++j) {
QueueItem* qi = j->second;
StringList sl;
StringListInfo li(qi);
for(int k = 0; k < COLUMN_LAST; k++) {
sl.push_back(li.columns[k]);
}
ctrlQueue.insert(ctrlQueue.GetItemCount(), sl, WinUtil::getIconIndex(qi->getTarget()), (LPARAM)qi);
}
ctrlQueue.SetRedraw(TRUE);
ctrlQueue.resort();
curDir = getSelectedDir();
updateStatus();
}
// Put it here to avoid a copy for each recursion...
static char tmpBuf[1024];
void QueueFrame::moveNode(HTREEITEM item, HTREEITEM parent) {
TVINSERTSTRUCT tvis;
memset(&tvis, 0, sizeof(tvis));
tvis.itemex.hItem = item;
tvis.itemex.mask = TVIF_CHILDREN | TVIF_HANDLE | TVIF_IMAGE | TVIF_INTEGRAL | TVIF_PARAM |
TVIF_SELECTEDIMAGE | TVIF_STATE | TVIF_TEXT;
tvis.itemex.pszText = tmpBuf;
tvis.itemex.cchTextMax = 1024;
ctrlDirs.GetItem((TVITEM*)&tvis.itemex);
tvis.hInsertAfter = TVI_SORT;
tvis.hParent = parent;
HTREEITEM ht = ctrlDirs.InsertItem(&tvis);
HTREEITEM next = ctrlDirs.GetChildItem(item);
while(next != NULL) {
moveNode(next, ht);
next = ctrlDirs.GetChildItem(item);
}
ctrlDirs.DeleteItem(item);
}
void QueueFrame::onAction(QueueManagerListener::Types type, QueueItem* aQI) throw() {
switch(type) {
case QueueManagerListener::ADDED: onQueueAdded(aQI); break;
case QueueManagerListener::QUEUE_ITEM: onQueueAdded(aQI); onQueueUpdated(aQI); break;
case QueueManagerListener::REMOVED: onQueueRemoved(aQI); break;
case QueueManagerListener::MOVED: onQueueMoved(aQI); break;
case QueueManagerListener::SOURCES_UPDATED: onQueueUpdated(aQI); break;
case QueueManagerListener::STATUS_UPDATED: onQueueUpdated(aQI); break;
default: break;
}
};
/**
* @file
* $Id: QueueFrame.cpp,v 1.24 2003/07/15 14:53:12 arnetheduck Exp $
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -