📄 sharedfilesctrl.cpp
字号:
//this file is part of eMule
//Copyright (C)2002 Merkur ( devs@emule-project.net / http://www.emule-project.net )
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either
//version 2 of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "stdafx.h"
#include "emule.h"
#include "emuledlg.h"
#include "SharedFilesCtrl.h"
#include "OtherFunctions.h"
#include "CommentDialog.h"
#include "FileInfoDialog.h"
#include "MetaDataDlg.h"
#include "ResizableLib/ResizableSheet.h"
#include "KnownFile.h"
#include "MapKey.h"
#include "SharedFileList.h"
#include "MemDC.h"
#include "PartFile.h"
#include "MenuCmds.h"
#include "IrcWnd.h"
#include "SharedFilesWnd.h"
#include "Opcodes.h"
#include "InputBox.h"
#include "WebServices.h"
#include "TransferWnd.h"
#include "ClientList.h"
#include "UpDownClient.h"
#include "ED2kLinkDlg.h"
#include "HighColorTab.hpp"
#include "ListViewWalkerPropertySheet.h"
#include "UserMsgs.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//////////////////////////////////////////////////////////////////////////////
// CSharedFileDetailsSheet
class CSharedFileDetailsSheet : public CListViewWalkerPropertySheet
{
DECLARE_DYNAMIC(CSharedFileDetailsSheet)
public:
CSharedFileDetailsSheet(CTypedPtrList<CPtrList, CKnownFile*>& aFiles, UINT uPshInvokePage = 0, CListCtrlItemWalk* pListCtrl = NULL);
virtual ~CSharedFileDetailsSheet();
protected:
CFileInfoDialog m_wndMediaInfo;
CMetaDataDlg m_wndMetaData;
CED2kLinkDlg m_wndFileLink;
CCommentDialog m_wndFileComments;
UINT m_uPshInvokePage;
static LPCTSTR m_pPshStartPage;
void UpdateTitle();
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP()
afx_msg void OnDestroy();
afx_msg LRESULT OnDataChanged(WPARAM, LPARAM);
};
LPCTSTR CSharedFileDetailsSheet::m_pPshStartPage;
IMPLEMENT_DYNAMIC(CSharedFileDetailsSheet, CListViewWalkerPropertySheet)
BEGIN_MESSAGE_MAP(CSharedFileDetailsSheet, CListViewWalkerPropertySheet)
ON_WM_DESTROY()
ON_MESSAGE(UM_DATA_CHANGED, OnDataChanged)
END_MESSAGE_MAP()
CSharedFileDetailsSheet::CSharedFileDetailsSheet(CTypedPtrList<CPtrList, CKnownFile*>& aFiles, UINT uPshInvokePage, CListCtrlItemWalk* pListCtrl)
: CListViewWalkerPropertySheet(pListCtrl)
{
m_uPshInvokePage = uPshInvokePage;
POSITION pos = aFiles.GetHeadPosition();
while (pos)
m_aItems.Add(aFiles.GetNext(pos));
m_psh.dwFlags &= ~PSH_HASHELP;
m_wndMediaInfo.m_psp.dwFlags &= ~PSP_HASHELP;
m_wndMediaInfo.m_psp.dwFlags |= PSP_USEICONID;
m_wndMediaInfo.m_psp.pszIcon = _T("MEDIAINFO");
m_wndMediaInfo.SetFiles(&m_aItems);
AddPage(&m_wndMediaInfo);
m_wndMetaData.m_psp.dwFlags &= ~PSP_HASHELP;
m_wndMetaData.m_psp.dwFlags |= PSP_USEICONID;
m_wndMetaData.m_psp.pszIcon = _T("METADATA");
if (m_aItems.GetSize() == 1 && thePrefs.IsExtControlsEnabled()) {
m_wndMetaData.SetFiles(&m_aItems);
AddPage(&m_wndMetaData);
}
m_wndFileLink.m_psp.dwFlags &= ~PSP_HASHELP;
m_wndFileLink.m_psp.dwFlags |= PSP_USEICONID;
m_wndFileLink.m_psp.pszIcon = _T("ED2KLINK");
m_wndFileLink.SetFiles(&m_aItems);
AddPage(&m_wndFileLink);
m_wndFileComments.m_psp.dwFlags &= ~PSP_HASHELP;
m_wndFileComments.m_psp.dwFlags |= PSP_USEICONID;
m_wndFileComments.m_psp.pszIcon = _T("FileComments");
m_wndFileComments.SetFiles(&m_aItems);
AddPage(&m_wndFileComments);
LPCTSTR pPshStartPage = m_pPshStartPage;
if (m_uPshInvokePage != 0)
pPshStartPage = MAKEINTRESOURCE(m_uPshInvokePage);
for (int i = 0; i < m_pages.GetSize(); i++)
{
CPropertyPage* pPage = GetPage(i);
if (pPage->m_psp.pszTemplate == pPshStartPage)
{
m_psh.nStartPage = i;
break;
}
}
}
CSharedFileDetailsSheet::~CSharedFileDetailsSheet()
{
}
void CSharedFileDetailsSheet::OnDestroy()
{
if (m_uPshInvokePage == 0)
m_pPshStartPage = GetPage(GetActiveIndex())->m_psp.pszTemplate;
CListViewWalkerPropertySheet::OnDestroy();
}
BOOL CSharedFileDetailsSheet::OnInitDialog()
{
EnableStackedTabs(FALSE);
BOOL bResult = CListViewWalkerPropertySheet::OnInitDialog();
HighColorTab::UpdateImageList(*this);
InitWindowStyles(this);
EnableSaveRestore(_T("SharedFileDetailsSheet")); // call this after(!) OnInitDialog
UpdateTitle();
return bResult;
}
LRESULT CSharedFileDetailsSheet::OnDataChanged(WPARAM, LPARAM)
{
UpdateTitle();
return 1;
}
void CSharedFileDetailsSheet::UpdateTitle()
{
if (m_aItems.GetSize() == 1)
SetWindowText(GetResString(IDS_DETAILS) + _T(": ") + STATIC_DOWNCAST(CKnownFile, m_aItems[0])->GetFileName());
else
SetWindowText(GetResString(IDS_DETAILS));
}
BOOL CSharedFileDetailsSheet::OnCommand(WPARAM wParam, LPARAM lParam)
{
if (wParam == ID_APPLY_NOW)
{
CSharedFilesCtrl* pSharedFilesCtrl = DYNAMIC_DOWNCAST(CSharedFilesCtrl, m_pListCtrl->GetListCtrl());
if (pSharedFilesCtrl)
{
for (int i = 0; i < m_aItems.GetSize(); i++) {
// so, and why does this not(!) work while the sheet is open ??
pSharedFilesCtrl->UpdateFile(DYNAMIC_DOWNCAST(CKnownFile, m_aItems[i]));
}
}
}
return CListViewWalkerPropertySheet::OnCommand(wParam, lParam);
}
//////////////////////////////////////////////////////////////////////////////
// CSharedFilesCtrl
IMPLEMENT_DYNAMIC(CSharedFilesCtrl, CMuleListCtrl)
BEGIN_MESSAGE_MAP(CSharedFilesCtrl, CMuleListCtrl)
ON_WM_SYSCOLORCHANGE()
ON_WM_CONTEXTMENU()
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnClick)
ON_NOTIFY_REFLECT(NM_DBLCLK, OnNMDblclk)
ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetDispInfo)
ON_WM_KEYDOWN()
END_MESSAGE_MAP()
CSharedFilesCtrl::CSharedFilesCtrl()
: CListCtrlItemWalk(this)
{
memset(&sortstat, 0, sizeof(sortstat));
nAICHHashing = 0;
}
CSharedFilesCtrl::~CSharedFilesCtrl()
{
}
void CSharedFilesCtrl::Init()
{
CImageList ilDummyImageList; //dummy list for getting the proper height of listview entries
ilDummyImageList.Create(1, theApp.GetSmallSytemIconSize().cy,theApp.m_iDfltImageListColorFlags|ILC_MASK, 1, 1);
SetImageList(&ilDummyImageList, LVSIL_SMALL);
ASSERT( (GetStyle() & LVS_SHAREIMAGELISTS) == 0 );
ilDummyImageList.Detach();
SetExtendedStyle(LVS_EX_FULLROWSELECT);
ModifyStyle(LVS_SINGLESEL,0);
InsertColumn(0, GetResString(IDS_DL_FILENAME) ,LVCFMT_LEFT,250,0);
InsertColumn(1,GetResString(IDS_DL_SIZE),LVCFMT_LEFT,100,1);
InsertColumn(2,GetResString(IDS_TYPE),LVCFMT_LEFT,50,2);
InsertColumn(3,GetResString(IDS_PRIORITY),LVCFMT_LEFT,70,3);
InsertColumn(4,GetResString(IDS_FILEID),LVCFMT_LEFT,220,4);
InsertColumn(5,GetResString(IDS_SF_REQUESTS),LVCFMT_LEFT,100,5);
InsertColumn(6,GetResString(IDS_SF_ACCEPTS),LVCFMT_LEFT,100,6);
InsertColumn(7,GetResString(IDS_SF_TRANSFERRED),LVCFMT_LEFT,120,7);
InsertColumn(8,GetResString(IDS_UPSTATUS),LVCFMT_LEFT,100,8);
InsertColumn(9,GetResString(IDS_FOLDER),LVCFMT_LEFT,200,9);
InsertColumn(10,GetResString(IDS_COMPLSOURCES),LVCFMT_LEFT,100,10);
InsertColumn(11,GetResString(IDS_SHAREDTITLE),LVCFMT_LEFT,200,11);
SetAllIcons();
CreateMenues();
LoadSettings(CPreferences::tableShared);
// Barry - Use preferred sort order from preferences
int sortItem = thePrefs.GetColumnSortItem(CPreferences::tableShared);
bool sortAscending = thePrefs.GetColumnSortAscending(CPreferences::tableShared);
SetSortArrow(sortItem, sortAscending);
SortItems(SortProc, sortItem + (sortAscending ? 0:20));
}
void CSharedFilesCtrl::OnSysColorChange()
{
CMuleListCtrl::OnSysColorChange();
SetAllIcons();
CreateMenues();
}
void CSharedFilesCtrl::SetAllIcons()
{
m_ImageList.DeleteImageList();
m_ImageList.Create(16,16,theApp.m_iDfltImageListColorFlags|ILC_MASK,0,1);
m_ImageList.SetBkColor(CLR_NONE);
m_ImageList.Add(CTempIconLoader(_T("EMPTY")));
m_ImageList.Add(CTempIconLoader(_T("FileSharedServer"), 16, 16));
m_ImageList.Add(CTempIconLoader(_T("FileSharedKad"), 16, 16));
m_ImageList.SetOverlayImage(m_ImageList.Add(CTempIconLoader(_T("FileCommentsOvl"))), 1);
}
void CSharedFilesCtrl::Localize()
{
CHeaderCtrl* pHeaderCtrl = GetHeaderCtrl();
HDITEM hdi;
hdi.mask = HDI_TEXT;
CString strRes;
strRes = GetResString(IDS_DL_FILENAME);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(0, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_DL_SIZE);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(1, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_TYPE);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(2, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_PRIORITY);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(3, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_FILEID);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(4, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_SF_REQUESTS);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(5, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_SF_ACCEPTS);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(6, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_SF_TRANSFERRED);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(7, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_UPSTATUS);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(8, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_FOLDER);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(9, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_COMPLSOURCES);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(10, &hdi);
strRes.ReleaseBuffer();
strRes = GetResString(IDS_SHAREDTITLE);
hdi.pszText = strRes.GetBuffer();
pHeaderCtrl->SetItem(11, &hdi);
strRes.ReleaseBuffer();
CreateMenues();
int iItems = GetItemCount();
for (int i = 0; i < iItems; i++)
Update(i);
}
void CSharedFilesCtrl::AddFile(const CKnownFile* file)
{
if (!theApp.emuledlg->IsRunning())
return;
if (FindFile(file) != -1)
return;
int iItem = InsertItem(LVIF_TEXT|LVIF_PARAM, GetItemCount(), LPSTR_TEXTCALLBACK, 0, 0, 0, (LPARAM)file);
if (iItem >= 0)
Update(iItem);
}
void CSharedFilesCtrl::RemoveFile(const CKnownFile* file)
{
int iItem = FindFile(file);
if (iItem != -1)
{
DeleteItem(iItem);
ShowFilesCount();
}
}
void CSharedFilesCtrl::UpdateFile(const CKnownFile* file)
{
if (!file || !theApp.emuledlg->IsRunning())
return;
int iItem = FindFile(file);
if (iItem != -1)
{
Update(iItem);
if (GetItemState(iItem, LVIS_SELECTED))
theApp.emuledlg->sharedfileswnd->ShowSelectedFilesSummary();
}
}
int CSharedFilesCtrl::FindFile(const CKnownFile* pFile)
{
LVFINDINFO find;
find.flags = LVFI_PARAM;
find.lParam = (LPARAM)pFile;
return FindItem(&find);
}
void CSharedFilesCtrl::ReloadFileList()
{
DeleteAllItems();
theApp.emuledlg->sharedfileswnd->ShowSelectedFilesSummary();
CCKey bufKey;
CKnownFile* cur_file;
for (POSITION pos = theApp.sharedfiles->m_Files_map.GetStartPosition(); pos != 0; ){
theApp.sharedfiles->m_Files_map.GetNextAssoc(pos, bufKey, cur_file);
AddFile(cur_file);
}
ShowFilesCount();
}
void CSharedFilesCtrl::ShowFilesCount()
{
CString str;
if (theApp.sharedfiles->GetHashingCount() + nAICHHashing)
str.Format(_T(" (%i, %s %i)"), theApp.sharedfiles->GetCount(), GetResString(IDS_HASHING), theApp.sharedfiles->GetHashingCount() + nAICHHashing);
else
str.Format(_T(" (%i)"), theApp.sharedfiles->GetCount());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -