📄 sharedfilesctrl.cpp
字号:
break;
case MPG_ALTENTER:
case MP_DETAIL:{
CSharedFileDetailsSheet sheet(selectedList);
sheet.DoModal();
break;
}
case MP_SHOWED2KLINK:{
CSharedFileDetailsSheet sheet(selectedList, true);
sheet.DoModal();
break;
}
case MP_PRIOVERYLOW:
case MP_PRIOLOW:
case MP_PRIONORMAL:
case MP_PRIOHIGH:
case MP_PRIOVERYHIGH:
case MP_PRIOAUTO:
{
POSITION pos = selectedList.GetHeadPosition();
while (pos != NULL)
{
CKnownFile* file = selectedList.GetNext(pos);
switch (wParam) {
case MP_PRIOVERYLOW:
file->SetAutoUpPriority(false);
file->SetUpPriority(PR_VERYLOW);
UpdateItem(file);
break;
case MP_PRIOLOW:
file->SetAutoUpPriority(false);
file->SetUpPriority(PR_LOW);
UpdateItem(file);
break;
case MP_PRIONORMAL:
file->SetAutoUpPriority(false);
file->SetUpPriority(PR_NORMAL);
UpdateItem(file);
break;
case MP_PRIOHIGH:
file->SetAutoUpPriority(false);
file->SetUpPriority(PR_HIGH);
UpdateItem(file);
break;
case MP_PRIOVERYHIGH:
file->SetAutoUpPriority(false);
file->SetUpPriority(PR_VERYHIGH);
UpdateItem(file);
break;
case MP_PRIOAUTO:
file->SetAutoUpPriority(true);
file->UpdateAutoUpPriority();
UpdateFile(file);
break;
}
}
break;
}
default:
if (wParam>=MP_WEBURL && wParam<=MP_WEBURL+256){
theWebServices.RunURL(file, wParam);
}
break;
}
}
return TRUE;
}
void CSharedFilesCtrl::UpdateItem(CKnownFile* file)
{
LVFINDINFO info;
info.flags = LVFI_PARAM;
info.lParam = (LPARAM)file;
int iItem = FindItem(&info);
if (iItem >= 0)
Update(iItem);
}
void CSharedFilesCtrl::OnColumnClick( NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// Barry - Store sort order in preferences
// Determine ascending based on whether already sorted on this column
int sortItem = thePrefs.GetColumnSortItem(CPreferences::tableShared);
bool m_oldSortAscending = thePrefs.GetColumnSortAscending(CPreferences::tableShared);
bool sortAscending = (sortItem != pNMListView->iSubItem) ? true : !m_oldSortAscending;
// Item is column clicked
sortItem = pNMListView->iSubItem;
// Save new preferences
thePrefs.SetColumnSortItem(CPreferences::tableShared, sortItem);
thePrefs.SetColumnSortAscending(CPreferences::tableShared, sortAscending);
// Ornis 4-way-sorting
int adder=0;
if (pNMListView->iSubItem>=5 && pNMListView->iSubItem<=7)
{
ASSERT( pNMListView->iSubItem - 5 < ARRSIZE(sortstat) );
if (!sortAscending)
sortstat[pNMListView->iSubItem - 5] = !sortstat[pNMListView->iSubItem - 5];
adder = sortstat[pNMListView->iSubItem-5] ? 0 : 100;
}
else if (pNMListView->iSubItem==11)
{
ASSERT( 3 < ARRSIZE(sortstat) );
if (!sortAscending)
sortstat[3] = !sortstat[3];
adder = sortstat[3] ? 0 : 100;
}
// Sort table
if (adder==0)
SetSortArrow(sortItem, sortAscending);
else
SetSortArrow(sortItem, sortAscending ? arrowDoubleUp : arrowDoubleDown);
SortItems(SortProc, sortItem + adder + (sortAscending ? 0:20));
*pResult = 0;
}
int CSharedFilesCtrl::SortProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
const CKnownFile* item1 = (CKnownFile*)lParam1;
const CKnownFile* item2 = (CKnownFile*)lParam2;
switch(lParamSort){
case 0: //filename asc
return CompareLocaleStringNoCase(item1->GetFileName(),item2->GetFileName());
case 20: //filename desc
return CompareLocaleStringNoCase(item2->GetFileName(),item1->GetFileName());
case 1: //filesize asc
return item1->GetFileSize()==item2->GetFileSize()?0:(item1->GetFileSize()>item2->GetFileSize()?1:-1);
case 21: //filesize desc
return item1->GetFileSize()==item2->GetFileSize()?0:(item2->GetFileSize()>item1->GetFileSize()?1:-1);
case 2: //filetype asc
return item1->GetFileTypeDisplayStr().Compare(item2->GetFileTypeDisplayStr());
case 22: //filetype desc
return item2->GetFileTypeDisplayStr().Compare(item1->GetFileTypeDisplayStr());
case 3: //prio asc
{
uint8 p1=item1->GetUpPriority() +1;
if(p1==5)
p1=0;
uint8 p2=item2->GetUpPriority() +1;
if(p2==5)
p2=0;
return p1-p2;
}
case 23: //prio desc
{
uint8 p1=item1->GetUpPriority() +1;
if(p1==5)
p1=0;
uint8 p2=item2->GetUpPriority() +1;
if(p2==5)
p2=0;
return p2-p1;
}
case 4: //fileID asc
return memcmp(item1->GetFileHash(), item2->GetFileHash(), 16);
case 24: //fileID desc
return memcmp(item2->GetFileHash(), item1->GetFileHash(), 16);
case 5: //requests asc
return item1->statistic.GetRequests() - item2->statistic.GetRequests();
case 25: //requests desc
return item2->statistic.GetRequests() - item1->statistic.GetRequests();
case 6: //acc requests asc
return item1->statistic.GetAccepts() - item2->statistic.GetAccepts();
case 26: //acc requests desc
return item2->statistic.GetAccepts() - item1->statistic.GetAccepts();
case 7: //all transferred asc
return item1->statistic.GetTransferred()==item2->statistic.GetTransferred()?0:(item1->statistic.GetTransferred()>item2->statistic.GetTransferred()?1:-1);
case 27: //all transferred desc
return item1->statistic.GetTransferred()==item2->statistic.GetTransferred()?0:(item2->statistic.GetTransferred()>item1->statistic.GetTransferred()?1:-1);
case 9: //folder asc
return CompareLocaleStringNoCase(item1->GetPath(),item2->GetPath());
case 29: //folder desc
return CompareLocaleStringNoCase(item2->GetPath(),item1->GetPath());
case 10: //complete sources asc
return CompareUnsigned(item1->m_nCompleteSourcesCount, item2->m_nCompleteSourcesCount);
case 30: //complete sources desc
return CompareUnsigned(item2->m_nCompleteSourcesCount, item1->m_nCompleteSourcesCount);
case 11: //ed2k shared asc
return item1->GetPublishedED2K() - item2->GetPublishedED2K();
case 31: //ed2k shared desc
return item2->GetPublishedED2K() - item1->GetPublishedED2K();
case 105: //all requests asc
return item1->statistic.GetAllTimeRequests() - item2->statistic.GetAllTimeRequests();
case 125: //all requests desc
return item2->statistic.GetAllTimeRequests() - item1->statistic.GetAllTimeRequests();
case 106: //all acc requests asc
return item1->statistic.GetAllTimeAccepts() - item2->statistic.GetAllTimeAccepts();
case 126: //all acc requests desc
return item2->statistic.GetAllTimeAccepts() - item1->statistic.GetAllTimeAccepts();
case 107: //all transferred asc
return item1->statistic.GetAllTimeTransferred()==item2->statistic.GetAllTimeTransferred()?0:(item1->statistic.GetAllTimeTransferred()>item2->statistic.GetAllTimeTransferred()?1:-1);
case 127: //all transferred desc
return item1->statistic.GetAllTimeTransferred()==item2->statistic.GetAllTimeTransferred()?0:(item2->statistic.GetAllTimeTransferred()>item1->statistic.GetAllTimeTransferred()?1:-1);
case 111:{ //kad shared asc
uint32 tNow = time(NULL);
int i1 = (tNow - item1->GetLastPublishTimeKadSrc() < KADEMLIAREPUBLISHTIMES) ? 1 : 0;
int i2 = (tNow - item2->GetLastPublishTimeKadSrc() < KADEMLIAREPUBLISHTIMES) ? 1 : 0;
return i1 - i2;
}
case 131:{ //kad shared desc
uint32 tNow = time(NULL);
int i1 = (tNow - item1->GetLastPublishTimeKadSrc() < KADEMLIAREPUBLISHTIMES) ? 1 : 0;
int i2 = (tNow - item2->GetLastPublishTimeKadSrc() < KADEMLIAREPUBLISHTIMES) ? 1 : 0;
return i2 - i1;
}
default:
return 0;
}
}
void CSharedFilesCtrl::UpdateFile(const CKnownFile* pFile)
{
if (!theApp.emuledlg->IsRunning())
return;
LVFINDINFO find;
find.flags = LVFI_PARAM;
find.lParam = (LPARAM)pFile;
int iItem = FindItem(&find);
if (iItem != -1)
{
Update(iItem);
if (GetItemState(iItem, LVIS_SELECTED))
theApp.emuledlg->sharedfileswnd->ShowSelectedFilesSummary();
}
}
void CSharedFilesCtrl::ShowFilesCount()
{
CString counter;
if (theApp.sharedfiles->GetHashingCount() + nAICHHashing)
counter.Format(_T(" (%i, %s %i)"), theApp.sharedfiles->GetCount(), GetResString(IDS_HASHING), theApp.sharedfiles->GetHashingCount() + nAICHHashing);
else
counter.Format(_T(" (%i)"), theApp.sharedfiles->GetCount());
theApp.emuledlg->sharedfileswnd->GetDlgItem(IDC_TRAFFIC_TEXT)->SetWindowText(GetResString(IDS_SF_FILES) + counter);
}
void CSharedFilesCtrl::OpenFile(const CKnownFile* file)
{
ShellOpenFile(file->GetFilePath(), NULL);
}
void CSharedFilesCtrl::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)
{
int iSel = GetNextItem(-1, LVIS_SELECTED | LVIS_FOCUSED);
if (iSel != -1)
{
CKnownFile* file = (CKnownFile*)GetItemData(iSel);
if (file)
{
if (GetKeyState(VK_MENU) & 0x8000)
{
CTypedPtrList<CPtrList, CKnownFile*> aFiles;
aFiles.AddHead(file);
CSharedFileDetailsSheet sheet(aFiles);
sheet.DoModal();
}
else if (!file->IsPartFile())
OpenFile(file);
}
}
*pResult = 0;
}
void CSharedFilesCtrl::CreateMenues()
{
if (m_PrioMenu) VERIFY( m_PrioMenu.DestroyMenu() );
if (m_SharedFilesMenu) VERIFY( m_SharedFilesMenu.DestroyMenu() );
m_PrioMenu.CreateMenu();
m_PrioMenu.AppendMenu(MF_STRING,MP_PRIOVERYLOW,GetResString(IDS_PRIOVERYLOW));
m_PrioMenu.AppendMenu(MF_STRING,MP_PRIOLOW,GetResString(IDS_PRIOLOW));
m_PrioMenu.AppendMenu(MF_STRING,MP_PRIONORMAL,GetResString(IDS_PRIONORMAL));
m_PrioMenu.AppendMenu(MF_STRING,MP_PRIOHIGH, GetResString(IDS_PRIOHIGH));
m_PrioMenu.AppendMenu(MF_STRING,MP_PRIOVERYHIGH, GetResString(IDS_PRIORELEASE));
m_PrioMenu.AppendMenu(MF_STRING,MP_PRIOAUTO, GetResString(IDS_PRIOAUTO));//UAP
m_SharedFilesMenu.CreatePopupMenu();
m_SharedFilesMenu.AddMenuTitle(GetResString(IDS_SHAREDFILES), true);
m_SharedFilesMenu.AppendMenu(MF_STRING,MP_OPEN, GetResString(IDS_OPENFILE), _T("OPENFILE"));
m_SharedFilesMenu.AppendMenu(MF_STRING,MP_OPENFOLDER, GetResString(IDS_OPENFOLDER), _T("OPENFOLDER"));
m_SharedFilesMenu.AppendMenu(MF_STRING,MP_RENAME, GetResString(IDS_RENAME) + _T("..."), _T("FILERENAME"));
m_SharedFilesMenu.AppendMenu(MF_STRING,MP_REMOVE, GetResString(IDS_DELETE), _T("DELETE"));
m_SharedFilesMenu.AppendMenu(MF_STRING|MF_SEPARATOR);
m_SharedFilesMenu.AppendMenu(MF_STRING|MF_POPUP,(UINT_PTR)m_PrioMenu.m_hMenu, GetResString(IDS_PRIORITY) + _T(" (") + GetResString(IDS_PW_CON_UPLBL) + _T(")"), _T("FILEPRIORITY"));
m_SharedFilesMenu.AppendMenu(MF_STRING|MF_SEPARATOR);
m_SharedFilesMenu.AppendMenu(MF_STRING,MP_DETAIL, GetResString(IDS_SHOWDETAILS), _T("FILEINFO"));
m_SharedFilesMenu.AppendMenu(MF_STRING,MP_SHOWED2KLINK, GetResString(IDS_DL_SHOWED2KLINK), _T("ED2KLINK") );
m_SharedFilesMenu.AppendMenu(MF_STRING,MP_CMT, GetResString(IDS_CMT_ADD), _T("FILECOMMENTS"));
m_SharedFilesMenu.AppendMenu(MF_STRING|MF_SEPARATOR);
#if defined(_DEBUG)
//JOHNTODO: Not for release as we need kad lowID users in the network to see how well this work work. Also, we do not support these links yet.
m_SharedFilesMenu.AppendMenu(MF_STRING,MP_GETKADSOURCELINK, _T("Copy eD2K Links To Clipboard (Kad)"));
m_SharedFilesMenu.AppendMenu(MF_STRING|MF_SEPARATOR);
#endif
m_SharedFilesMenu.AppendMenu(MF_STRING,Irc_SetSendLink,GetResString(IDS_IRC_ADDLINKTOIRC), _T("IRCCLIPBOARD"));
m_SharedFilesMenu.AppendMenu(MF_STRING|MF_SEPARATOR);
}
void CSharedFilesCtrl::ShowComments(CKnownFile* file)
{
if (file){
CCommentDialog dialog(file);
dialog.DoModal();
}
}
void CSharedFilesCtrl::OnGetDispInfo(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
if (theApp.emuledlg->IsRunning()){
// Although we have an owner drawn listview control we store the text for the primary item in the listview, to be
// capable of quick searching those items via the keyboard. Because our listview items may change their contents,
// we do this via a text callback function. The listview control will send us the LVN_DISPINFO notification if
// it needs to know the contents of the primary item.
//
// But, the listview control sends this notification all the time, even if we do not search for an item. At least
// this notification is only sent for the visible items and not for all items in the list. Though, because this
// function is invoked *very* often, no *NOT* put any time consuming code here in.
if (pDispInfo->item.mask & LVIF_TEXT){
const CKnownFile* pFile = reinterpret_cast<CKnownFile*>(pDispInfo->item.lParam);
if (pFile != NULL){
switch (pDispInfo->item.iSubItem){
case 0:
if (pDispInfo->item.cchTextMax > 0){
_tcsncpy(pDispInfo->item.pszText, pFile->GetFileName(), pDispInfo->item.cchTextMax);
pDispInfo->item.pszText[pDispInfo->item.cchTextMax-1] = _T('\0');
}
break;
default:
// shouldn't happen
pDispInfo->item.pszText[0] = _T('\0');
break;
}
}
}
}
*pResult = 0;
}
void CSharedFilesCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar == 'C' && (GetKeyState(VK_CONTROL) & 0x8000))
{
// Ctrl+C: Copy listview items to clipboard
SendMessage(WM_COMMAND, MP_GETED2KLINK);
return;
}
CMuleListCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -