📄 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 "ED2kLinkDlg.h"
#include "HighColorTab.hpp"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////////////
// CSharedFileDetailsSheet
class CSharedFileDetailsSheet : public CResizableSheet
{
DECLARE_DYNAMIC(CSharedFileDetailsSheet)
public:
CSharedFileDetailsSheet(const CTypedPtrList<CPtrList, CKnownFile*>& aFiles, bool bShowLinkPage = false);
virtual ~CSharedFileDetailsSheet();
protected:
CSimpleArray<const CKnownFile*> m_aKnownFiles;
CFileInfoDialog m_wndMediaInfo;
CMetaDataDlg m_wndMetaData;
CED2kLinkDlg m_wndFileLink;
static int sm_iLastActivePage;
bool m_bShowLinkPage;
virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP()
afx_msg void OnDestroy();
};
int CSharedFileDetailsSheet::sm_iLastActivePage;
IMPLEMENT_DYNAMIC(CSharedFileDetailsSheet, CResizableSheet)
BEGIN_MESSAGE_MAP(CSharedFileDetailsSheet, CResizableSheet)
ON_WM_DESTROY()
END_MESSAGE_MAP()
CSharedFileDetailsSheet::CSharedFileDetailsSheet(const CTypedPtrList<CPtrList, CKnownFile*>& aFiles, bool bShowLinkPage)
{
POSITION pos = aFiles.GetHeadPosition();
while (pos)
m_aKnownFiles.Add(aFiles.GetNext(pos));
m_psh.dwFlags &= ~PSH_HASHELP;
m_psh.dwFlags |= PSH_NOAPPLYNOW;
m_wndMediaInfo.m_psp.dwFlags &= ~PSP_HASHELP;
m_wndMediaInfo.m_psp.dwFlags |= PSP_USEICONID;
m_wndMediaInfo.m_psp.pszIcon = _T("MEDIAINFO");
m_wndMetaData.m_psp.dwFlags &= ~PSP_HASHELP;
m_wndMetaData.m_psp.dwFlags |= PSP_USEICONID;
m_wndMetaData.m_psp.pszIcon = _T("METADATA");
m_wndMediaInfo.SetMyfile(&m_aKnownFiles);
if (m_aKnownFiles.GetSize() == 1 && thePrefs.IsExtControlsEnabled())
m_wndMetaData.SetFile(m_aKnownFiles[0]);
AddPage(&m_wndMediaInfo);
if (m_aKnownFiles.GetSize() == 1 && thePrefs.IsExtControlsEnabled())
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.SetMyfile(&m_aKnownFiles);
AddPage(&m_wndFileLink);
m_bShowLinkPage = bShowLinkPage;
}
CSharedFileDetailsSheet::~CSharedFileDetailsSheet()
{
}
void CSharedFileDetailsSheet::OnDestroy()
{
if (!m_bShowLinkPage)
sm_iLastActivePage = GetActiveIndex();
CResizableSheet::OnDestroy();
}
BOOL CSharedFileDetailsSheet::OnInitDialog()
{
EnableStackedTabs(FALSE);
BOOL bResult = CResizableSheet::OnInitDialog();
HighColorTab::UpdateImageList(*this);
InitWindowStyles(this);
EnableSaveRestore(_T("SharedFileDetailsSheet")); // call this after(!) OnInitDialog
if (m_aKnownFiles.GetSize() == 1)
SetWindowText(GetResString(IDS_DETAILS) + _T(": ") + m_aKnownFiles[0]->GetFileName());
else
SetWindowText(GetResString(IDS_DETAILS));
if (m_bShowLinkPage){
for (int i = 0; i < m_pages.GetSize(); i++)
{
CPropertyPage* pPage = GetPage(i);
if (pPage->m_psp.pszTemplate == MAKEINTRESOURCE(IDD_ED2KLINK))
{
SetActivePage(i);
break;
}
}
}
else if (sm_iLastActivePage < GetPageCount())
SetActivePage(sm_iLastActivePage);
return bResult;
}
//////////////////////////////////////////////////////////////////////////////
// CSharedFilesCtrl
IMPLEMENT_DYNAMIC(CSharedFilesCtrl, CMuleListCtrl)
CSharedFilesCtrl::CSharedFilesCtrl()
{
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);
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::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::ShowFileList(const CSharedFileList* pSharedFiles)
{
DeleteAllItems();
CCKey bufKey;
CKnownFile* cur_file;
for (POSITION pos = pSharedFiles->m_Files_map.GetStartPosition(); pos != 0; ){
pSharedFiles->m_Files_map.GetNextAssoc(pos, bufKey, cur_file);
ShowFile(cur_file);
}
ShowFilesCount();
}
#define DLC_DT_TEXT (DT_LEFT|DT_SINGLELINE|DT_VCENTER|DT_NOPREFIX|DT_END_ELLIPSIS)
void CSharedFilesCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if( !theApp.emuledlg->IsRunning() )
return;
if( !lpDrawItemStruct->itemData)
return;
CDC* odc = CDC::FromHandle(lpDrawItemStruct->hDC);
BOOL bCtrlFocused = ((GetFocus() == this ) || (GetStyle() & LVS_SHOWSELALWAYS));
if( odc && (lpDrawItemStruct->itemAction | ODA_SELECT) && (lpDrawItemStruct->itemState & ODS_SELECTED )){
if(bCtrlFocused)
odc->SetBkColor(m_crHighlight);
else
odc->SetBkColor(m_crNoHighlight);
}
else
odc->SetBkColor(m_crWindow);
const CKnownFile* file = (CKnownFile*)lpDrawItemStruct->itemData;
CMemDC dc(CDC::FromHandle(lpDrawItemStruct->hDC), &lpDrawItemStruct->rcItem);
CFont* pOldFont = dc.SelectObject(GetFont());
RECT cur_rec = lpDrawItemStruct->rcItem;
COLORREF crOldTextColor = dc.SetTextColor(m_crWindowText);
int iOldBkMode;
if (m_crWindowTextBk == CLR_NONE){
DefWindowProc(WM_ERASEBKGND, (WPARAM)(HDC)dc, 0);
iOldBkMode = dc.SetBkMode(TRANSPARENT);
}
else
iOldBkMode = OPAQUE;
CHeaderCtrl *pHeaderCtrl = GetHeaderCtrl();
int iCount = pHeaderCtrl->GetItemCount();
const int iMarginX = 4;
cur_rec.right = cur_rec.left - iMarginX*2;
cur_rec.left += iMarginX;
CString buffer;
int iIconDrawWidth = theApp.GetSmallSytemIconSize().cx + 3;
for(int iCurrent = 0; iCurrent < iCount; iCurrent++){
int iColumn = pHeaderCtrl->OrderToIndex(iCurrent);
if( !IsColumnHidden(iColumn) ){
UINT uDTFlags = DLC_DT_TEXT;
cur_rec.right += GetColumnWidth(iColumn);
switch(iColumn){
case 0:{
int iImage = theApp.GetFileTypeSystemImageIdx(file->GetFileName());
if (theApp.GetSystemImageList() != NULL)
::ImageList_Draw(theApp.GetSystemImageList(), iImage, dc->GetSafeHdc(), cur_rec.left, cur_rec.top, ILD_NORMAL|ILD_TRANSPARENT);
cur_rec.left += iIconDrawWidth;
buffer = file->GetFileName();
break;
}
case 1:
buffer = CastItoXBytes(file->GetFileSize(), false, false);
uDTFlags |= DT_RIGHT;
break;
case 2:
buffer = file->GetFileTypeDisplayStr();
break;
case 3:{
switch (file->GetUpPriority()) {
case PR_VERYLOW :
buffer = GetResString(IDS_PRIOVERYLOW);
break;
case PR_LOW :
if( file->IsAutoUpPriority() )
buffer = GetResString(IDS_PRIOAUTOLOW);
else
buffer = GetResString(IDS_PRIOLOW);
break;
case PR_NORMAL :
if( file->IsAutoUpPriority() )
buffer = GetResString(IDS_PRIOAUTONORMAL);
else
buffer = GetResString(IDS_PRIONORMAL);
break;
case PR_HIGH :
if( file->IsAutoUpPriority() )
buffer = GetResString(IDS_PRIOAUTOHIGH);
else
buffer = GetResString(IDS_PRIOHIGH);
break;
case PR_VERYHIGH :
buffer = GetResString(IDS_PRIORELEASE);
break;
default:
buffer.Empty();
}
break;
}
case 4:
buffer = md4str(file->GetFileHash());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -