www.pudn.com > GGBT.rar > DlgNewDownload.cpp


// DlgNewDownload.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "testbt.h" 
#include "DlgNewDownload.h" 
 
 
#include "CategoryNewDlg.h" 
#include "FileBase.h" 
#include "FileTorrent.h" 
#include "SetupRegister.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
const string CDlgNewDownload::m_strSaveAsSection = "SaveAs"; 
const string CDlgNewDownload::m_strSaveAsCategoryKey = "Category"; 
const string CDlgNewDownload::m_strSaveAsDirectoryKey = "DefaultDirectory"; 
 
const CString CDlgNewDownload::m_strSection = "DlgNewDownload"; 
///////////////////////////////////////////////////////////////////////////// 
// CDlgNewDownload dialog 
 
 
CDlgNewDownload::CDlgNewDownload(CImageList*	pImageList,  
		CFileTorrent* pfiletorrent, CCategoryBarWnd* pCategoryBarWnd, bool bNewOrProperty, CFileDBItem* pFileDBItem, long	lDirectoryID, string strDirectorySave, CWnd* pParent /*=NULL*/) 
	: CExpandingDialog(CDlgNewDownload::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CDlgNewDownload) 
	m_strRename = _T(""); 
	m_strInfohash = _T(""); 
	m_strUrl = _T(""); 
	m_strComment = _T(""); 
	m_strTorrentFileName = _T(""); 
	m_iStartMode = -1; 
	//}}AFX_DATA_INIT 
 
	m_pImageList = pImageList; 
	m_pfiletorrent = pfiletorrent; 
	m_pCategoryBarWnd = pCategoryBarWnd; 
	m_bNewOrProperty = bNewOrProperty; 
	m_lDirectoryID = lDirectoryID; 
	m_strDirectorySave = strDirectorySave; 
 
	m_bNoNotification = false; 
	m_iStartMode = 0; 
	m_lSubFilesWndWidth = 300; 
 
	m_pFileDBItem = pFileDBItem; 
} 
 
 
void CDlgNewDownload::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CDlgNewDownload) 
	DDX_Control(pDX, IDC_BUTTON_MORE, m_btnMore); 
	DDX_Control(pDX, IDC_BUTTON_DOWNLOAD_LATER, m_btnDownloadLater); 
	DDX_Control(pDX, IDC_BUTTON_DIRECTORY_SELECT, m_btnBrowseDir); 
	DDX_Control(pDX, IDC_BUTTON_CATEGORY_NEW, m_btnCategoryNew); 
	DDX_Control(pDX, IDC_BUTTON_SAVE_AS_DEFAULT, m_btnSaveAsDef); 
	DDX_Control(pDX, IDCANCEL, m_btnCancel); 
	DDX_Control(pDX, IDOK, m_btnOK); 
	DDX_Control(pDX, IDC_TREE_SUBFILES, m_treeSubFiles); 
	DDX_Control(pDX, IDC_COMBO_DIRECTORY_SAVE, m_cbDirectorySave); 
	DDX_Control(pDX, IDC_COMBO_CATEGORY, m_cbCategory); 
	DDX_Text(pDX, IDC_EDIT_RENAME, m_strRename); 
	DDX_Text(pDX, IDC_EDIT_INFOHASH, m_strInfohash); 
	DDX_Text(pDX, IDC_EDIT_URL, m_strUrl); 
	DDX_Text(pDX, IDC_EDIT_COMMENT, m_strComment); 
	DDX_Text(pDX, IDC_EDIT_TORRENT_FILE, m_strTorrentFileName); 
	DDX_Radio(pDX, IDC_RADIO_DOWNLOAD_IMMEDIATELY, m_iStartMode); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CDlgNewDownload, CExpandingDialog) 
	//{{AFX_MSG_MAP(CDlgNewDownload) 
	ON_CBN_SELCHANGE(IDC_COMBO_CATEGORY, OnSelchangeComboCategory) 
	ON_BN_CLICKED(IDC_BUTTON_CATEGORY_NEW, OnButtonCategoryNew) 
	ON_BN_CLICKED(IDC_BUTTON_DIRECTORY_SELECT, OnButtonDirectorySelect) 
	ON_BN_CLICKED(IDC_BUTTON_SAVE_AS_DEFAULT, OnButtonSaveAsDefault) 
	ON_WM_DESTROY() 
	ON_BN_CLICKED(IDC_RADIO_DOWNLOAD_MANUALY, OnRadioDownloadManualy) 
	ON_BN_CLICKED(IDC_RADIO_DOWNLOAD_IMMEDIATELY, OnRadioDownloadImmediately) 
	ON_WM_CTLCOLOR() 
	//}}AFX_MSG_MAP 
	ON_BN_CLICKED(IDC_BUTTON_DOWNLOAD_LATER, OnButtonDownloadLater) 
	ON_MESSAGE(WM_SPLITTER_MOVED, OnSplitterMoved) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CDlgNewDownload message handlers 
 
 
void CDlgNewDownload::LoadState() 
{ 
	CString strKey = "width"; 
	// m_lSubFilesWndWidth = AfxGetApp()->GetProfileInt(m_strSection, strKey, m_lSubFilesWndWidth); 
 
	strKey = "expand"; 
	bool bExpand = AfxGetApp()->GetProfileInt(m_strSection, strKey, false) != 0; 
	Expand(bExpand); 
 
 
	strKey = "startMode"; 
	m_iStartMode = AfxGetApp()->GetProfileInt(m_strSection, strKey, m_iStartMode); 
} 
 
void CDlgNewDownload::SaveStateWhenDestory() 
{ 
	CString strKey = "width"; 
	// AfxGetApp()->WriteProfileInt(m_strSection, strKey, m_lSubFilesWndWidth); 
	strKey = "expand"; 
	AfxGetApp()->WriteProfileInt(m_strSection, strKey, IsExpanded()); 
} 
 
void CDlgNewDownload::SaveState() 
{ 
	CString strKey = "startMode"; 
	AfxGetApp()->WriteProfileInt(m_strSection, strKey, m_iStartMode); 
} 
 
BOOL CDlgNewDownload::OnInitDialog()  
{ 
	CExpandingDialog::OnInitDialog(); 
 
	 
	// 
	// Create BitmapList 
	// 
	HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), 
		MAKEINTRESOURCE(IDB_BITMAP_DLG_ICONS), 
		IMAGE_BITMAP, 
		0,0, // cx,cy 
		LR_CREATEDIBSECTION); // | LR_LOADMAP3DCOLORS ); 
	CBitmap bm; 
	bm.Attach(hbm); 
 
	m_ctlImage.Create(16,15, ILC_COLOR8|ILC_MASK, 3, 4); 
	m_ctlImage.SetBkColor(RGB(255, 255,255));  
	m_ctlImage.Add(&bm, (COLORREF)RGB(255,0,255)); 
	 
	// 
	// set button image. 
	// 
	// m_btnBrowseDir.Create(m_ctlImage.ExtractIcon(2), true, "选择保存路径"); 
	m_btnOK.Create(m_ctlImage.ExtractIcon(0)); 
	m_btnCancel.Create(m_ctlImage.ExtractIcon(1)); 
	m_btnDownloadLater.Create(m_ctlImage.ExtractIcon(3)); 
	m_btnSaveAsDef.Create(m_ctlImage.ExtractIcon(4), true, "保存为缺省设置"); 
	m_btnCategoryNew.Create(m_ctlImage.ExtractIcon(2), true, "添加类别"); 
	m_btnBrowseDir.Create(m_ctlImage.ExtractIcon(2), true, "选择保存目录"); 
 
 
	// m_btnDownloadLater.ShowWindow(m_bNewOrProperty); 
	m_btnDownloadLater.SetWindowText(m_bNewOrProperty ? "添加下载" : "保存属性"); 
 
	assert(m_pCategoryBarWnd);	 
	SetWindowText(m_bNewOrProperty ? "添加新的下载" : "属性"); 
 
	CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_COMMENT); 
	if (pEdit) 
	{ 
		pEdit->SetLimitText(100); 
	} 
 
	 
	// 
	// load register setup. 
	// 
	LoadState(); 
	UpdateData(false); 
 
	// load DirectorySave history 
	m_cbDirectorySave.LoadHistory("DirectorySave", "HistoryComboEx"); 
 
 
	// 
	// load data. 
	// 
	m_treeSubFiles.Init(); 
	Load(); 
	LoadTorrent(); 
 
	 
	/* 
	// Create splitter. 
	// m_wndHSplitterBar.Create(WS_CHILD|WS_BORDER|WS_DLGFRAME|WS_VISIBLE,	CRect (0, 0, 100, 100), this, 112909, FALSE);		 
	CRect rc; 
	m_treeSubFiles.GetWindowRect(rc); 
	ScreenToClient(rc); 
	rc.right = rc.left + m_lSubFilesWndWidth; 
	m_treeSubFiles.MoveWindow(rc); 
	m_wndHSplitterBar.SetPanes(&m_treeSubFiles, GetDlgItem(IDC_EDIT_COMMENT)); 
	//*/ 
	 
 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
void CDlgNewDownload::OnDestroy()  
{ 
	SaveStateWhenDestory(); 
	CExpandingDialog::OnDestroy();		 
} 
 
 
void CDlgNewDownload::OnSplitterMoved(long lParam, long wParam) 
{ 
	CRect rc; 
	m_treeSubFiles.GetClientRect(rc); 
	long lTreeCX = rc.Width(); 
	m_lSubFilesWndWidth = lTreeCX; 
} 
 
void CDlgNewDownload::LoadTorrent() 
{ 
	assert(m_pfiletorrent && m_pfiletorrent->GetResponse()); 
 
	if (!m_bNewOrProperty) 
		assert(m_pFileDBItem); 
 
	m_treeSubFiles.Monitor(m_pfiletorrent, m_bNewOrProperty ? string() : m_strDirectorySave, m_pFileDBItem); 
	m_treeSubFiles.ShowSubFiles(); 
 
	if (m_bNewOrProperty) 
	{ 
		m_strComment = m_pfiletorrent->GetComment().data(); 
		m_strRename = m_pfiletorrent->GetSaveName().data(); 
	} 
 
	m_strInfohash = m_pfiletorrent->GetInfohashString().data(); 
	m_strUrl = m_pfiletorrent->GetUrl().data(); 
	m_strTorrentFileName = m_pfiletorrent->GetTorrentFileName().data(); 
	UpdateData(false); 
} 
 
void CDlgNewDownload::Load() 
{ 
	assert(m_pImageList); 
 
	// show the categorys. 
	m_cbCategory.m_pimgList = m_pImageList; // &(m_pCategoryBarWnd->m_ctlImage); 
	m_cbCategory.DeleteAllItems();		 
	Copy(m_pCategoryBarWnd->GetRootItem()); 
 
	// 
	// get directoryID  
	// 
	CString strDefaultDirectory; 
 
	int lDirecotryID = 0; 
	if (m_bNewOrProperty) 
	{ 
		// get directoryID from register. 
		lDirecotryID = AfxGetApp()->GetProfileInt(m_strSaveAsSection.data(), m_strSaveAsCategoryKey.data(), 0); 
		strDefaultDirectory = AfxGetApp()->GetProfileString(m_strSaveAsSection.data(), m_strSaveAsDirectoryKey.data(), 0); 
		m_cbDirectorySave.SetWindowText(strDefaultDirectory);		 
	} 
	else 
	{ 
		assert(m_lDirectoryID != -1); 
		lDirecotryID = m_lDirectoryID; 
	} 
 
	// show selected category 
	int iCurSel = 0; 
	for (int i=0; im_lDirectoryID == lDirecotryID) 
		{ 
			iCurSel = i; 
			break; 
		} 
	} 
 
	m_bNoNotification = true; 
	m_cbCategory.SetCurSel(iCurSel); 
	m_bNoNotification = false; 
 
	if (strDefaultDirectory.IsEmpty()) 
		OnSelchangeComboCategory(); 
 
	// 
	// Show the details. 
	// 
	if (m_bNewOrProperty) 
	{ 
		// OnSelchangeComboCategory(); 
	} 
	else 
	{ 
		if (!m_pFileDBItem) 
		{ 
			assert(false); 
			return; 
		} 
 
		CString strInputPath = m_strDirectorySave.data(); 
		int iSplit = strInputPath.ReverseFind('\\'); 
 
		m_strRename = strInputPath.Right(strInputPath.GetLength() - iSplit); 
 
		m_strComment = m_pFileDBItem->m_strComment.data(); 
		UpdateData(false); 
		 
		m_cbDirectorySave.SetWindowText(strInputPath.Left(iSplit)); 
 
		// only load input parameter once. 
		m_bNewOrProperty = false; 
	} 
} 
 
void CDlgNewDownload::Copy(CTreeCursor& curItem, int iIndent) 
{	 
	if (!curItem) return; 
 
	// don't show downloading category. 
	if (curItem == this->m_pCategoryBarWnd->m_curDownloading) 
		return; 
 
	SFOLDER* pFolder = new SFOLDER; 
	pFolder->m_iImageIndex = curItem.GetImageID(); 
	pFolder->m_iIndent = iIndent; 
	pFolder->m_hItem = curItem; 
 
	CString sztext = curItem.GetText(); 
	int iItem = m_cbCategory.AddString(sztext); 
	m_cbCategory.SetItemDataPtr(iItem, pFolder); 
 
	if (curItem.HasChildren()) 
	{ 
		CTreeCursor curChild = curItem.GetChild(); 
		while (curChild) 
		{ 
			Copy(curChild, iIndent+1); 
			curChild = curChild.GetNext(TVGN_NEXT); 
		} 
	} 
} 
 
void CDlgNewDownload::OnOK()  
{ 
	// start download. 
	UpdateData(); 
	 
	if (m_bNewOrProperty) 
	{ 
		if (!ApplyData()) return; 
	} 
	else 
	{ 
		m_treeSubFiles.GetChecks(); 
	} 
 
	m_iStartMode = 0; 
	CDialog::OnOK(); 
} 
 
void CDlgNewDownload::OnButtonDownloadLater() 
{ 
	UpdateData(); 
 
	if (m_bNewOrProperty) 
	{ 
		if (!ApplyData()) return; 
	} 
	else 
	{ 
		m_treeSubFiles.GetChecks(); 
	} 
 
	// don't start download. 
	m_iStartMode = 1; 
 
	EndDialog(IDOK); 
} 
 
bool CDlgNewDownload::ApplyData() 
{	 
	assert(m_pfiletorrent); 
 
 
	if (m_strRename.IsEmpty()) 
		m_strRename = m_pfiletorrent->GetSaveName().data(); 
 
	// save the selected category. 
	int iCurSel = m_cbCategory.GetCurSel(); 
	assert(iCurSel != -1); 
	SFOLDER* pCategory= (SFOLDER*)m_cbCategory.GetItemDataPtr(iCurSel); 
	assert(pCategory); 
	m_ItemSel = pCategory->m_hItem; 
	if (!m_ItemSel) 
	{ 
		AfxMessageBox("invalid input"); 
		return false; 
	} 
 
	 
	// save DirectorySave history and the selected savedirectory. 
 
	CString strSave, strSaveDirectory; 
	m_cbDirectorySave.GetWindowText(strSave); 
	strSaveDirectory = strSave; 
	if (strSaveDirectory.IsEmpty()) 
	{ 
		AfxMessageBox("invalid input"); 
		m_cbDirectorySave.SetFocus(); 
		return false; 
	} 
	m_cbDirectorySave.SaveHistory(); 
 
	// check the input save path is valide. 
	strSaveDirectory = formatDir(strSaveDirectory.GetBuffer(0)).data(); 
	m_strDirectorySave = strSaveDirectory + m_strRename; 
	 
	DWORD dwAttr = GetFileAttributes(m_strDirectorySave.data()); 
	if (dwAttr !=  0xffffffff) 
	{ 
		if (!m_pCategoryBarWnd) 
		{ 
			assert(false); 
			return false; 
		} 
 
		if (m_pCategoryBarWnd->GetSetupRegister()->m_eOperSavenameExist == CSetupRegister::ePromptSavename) 
		{ 
			if (AfxMessageBox("同名文件(" + m_strRename + ")已经存在,是否覆盖?", MB_YESNO) != IDYES) 
			{ 
				((CEdit*)GetDlgItem(IDC_EDIT_RENAME))->SetSel(0, -1); 
				GetDlgItem(IDC_EDIT_RENAME)->SetFocus(); 
				return false; 
			} 
		} 
		else if (m_pCategoryBarWnd->GetSetupRegister()->m_eOperSavenameExist == CSetupRegister::eRename) 
		{ 
			CString strSaveName = m_strRename; 
			for (int i=0; i<100; i++) 
			{			 
				strSaveName.Format("%s%d",  m_strRename.GetBuffer(0), i); 
				m_strDirectorySave = strSaveDirectory + strSaveName; 
				 
				DWORD dwAttr = GetFileAttributes(m_strDirectorySave.data()); 
				if (dwAttr ==  0xffffffff) 
				{ 
					m_strRename = strSaveName; 
					m_strDirectorySave = strSaveDirectory + m_strRename; 
					break; 
				} 
			} 
		} 
		else // overwrite. 
		{ 
		} 
	} 
	 
	m_treeSubFiles.GetChecks(); 
 
	return true; 
} 
 
void CDlgNewDownload::OnSelchangeComboCategory()  
{ 
	if (m_bNoNotification) 
		return; 
 
	// show the default directory save. 
	int iCurSel = m_cbCategory.GetCurSel(); 
	if (iCurSel == -1) 
	{ 
		assert(iCurSel != -1); 
		return; 
	} 
 
	CCategoryBarWnd::CCategoryDBItem* pDBItem = GetDBItemData(iCurSel); 
	m_cbDirectorySave.SetWindowText(pDBItem->m_strDefaultDirectory.data()); 
} 
 
void CDlgNewDownload::OnButtonCategoryNew()  
{ 
	// get the item current selected. the itemsel is the default selected in new dialog. 
	int iCurSel = m_cbCategory.GetCurSel(); 
	assert(iCurSel != -1); 
	SFOLDER* pCategory = (SFOLDER*)m_cbCategory.GetItemDataPtr(iCurSel); 
	assert(pCategory && pCategory->m_hItem && m_pCategoryBarWnd); 
 
 
	CTreeCursor curNew; 
	if (m_pCategoryBarWnd->CreateNewCategory(CTreeCursor(pCategory->m_hItem, m_pCategoryBarWnd), curNew)) 
	{		 
		// reload tree data. 
		Load(); 
 
		// select the new created category. 
		for (int i=0; im_hItem); 
 
			if (pCategory->m_hItem == curNew) 
			{ 
				m_cbCategory.SetCurSel(i); 
				break; 
			} 
		} 
		 
		// refresh the directory save edit. 
		OnSelchangeComboCategory(); 
	} 
 
	m_cbCategory.SetFocus(); 
} 
 
void CDlgNewDownload::OnButtonDirectorySelect()  
{ 
	CString strDef, strFolder;	 
	m_cbDirectorySave.GetWindowText(strDef); 
 
	if (SelectFolder(strDef, strFolder)) 
	{ 
		m_cbDirectorySave.SetWindowText(strFolder); 
	} 
 
	m_cbDirectorySave.SetFocus(); 
} 
 
 
void CDlgNewDownload::OnButtonSaveAsDefault()  
{	 
	int iCurSel = m_cbCategory.GetCurSel(); 
	CString strDefaultDir; 
	m_cbDirectorySave.GetWindowText(strDefaultDir); 
 
	// write directoryID to register. 
	AfxGetApp()->WriteProfileInt(m_strSaveAsSection.data(), m_strSaveAsCategoryKey.data(), GetDBItemData(iCurSel)->m_lDirectoryID); 
	AfxGetApp()->WriteProfileString(m_strSaveAsSection.data(), m_strSaveAsDirectoryKey.data(), strDefaultDir); 
 
	UpdateData(); 
	SaveState(); 
} 
 
CCategoryBarWnd::CCategoryDBItem* CDlgNewDownload::GetDBItemData(int icbSel) 
{ 
	assert(icbSel >= 0 && icbSel < m_cbCategory.GetCount()); 
 
	SFOLDER* pCategory = (SFOLDER*)m_cbCategory.GetItemDataPtr(icbSel); 
	assert(pCategory && pCategory->m_hItem && m_pCategoryBarWnd); 
 
	CTreeCursor curItem = CTreeCursor(pCategory->m_hItem, m_pCategoryBarWnd); 
	CCategoryBarWnd::CCategoryDBItem* pDBItem = (CCategoryBarWnd::CCategoryDBItem*)curItem.GetData(); 
	assert(pDBItem); 
 
	return pDBItem; 
} 
 
void CDlgNewDownload::OnRadioDownloadImmediately()  
{ 
	// SetCheck(IDC_RADIO_DOWNLOAD_IMMEDIATELY); 
} 
 
 
void CDlgNewDownload::OnRadioDownloadManualy()  
{ 
	// SetCheck(IDC_RADIO_DOWNLOAD_MANUALY); 
} 
 
void CDlgNewDownload::SetCheck(UINT idBtn) 
{ 
	/* 
	static UINT buttons []={IDC_RADIO_DOWNLOAD_IMMEDIATELY, IDC_RADIO_DOWNLOAD_MANUALY}; 
	CButton *pBtn=NULL; 
	for(int i=0;i<2;i++) 
	{ 
		pBtn = (CButton*)GetDlgItem(buttons[i]); 
		if(!pBtn) continue; 
 
		if(buttons[i]==idBtn) 
			pBtn->SetCheck(true); 
		else 
			pBtn->SetCheck(0); 
	} 
	//*/ 
} 
 
HBRUSH CDlgNewDownload::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)  
{ 
	HBRUSH hbr = CExpandingDialog::OnCtlColor(pDC, pWnd, nCtlColor);	 
	 
	if (pWnd) 
	{ 
		switch (nCtlColor) 
		{ 
		case CTLCOLOR_EDIT: 
		case CTLCOLOR_STATIC: 
		// case CTLCOLOR_BTN: 
			switch (pWnd->GetDlgCtrlID()) 
			{	 
			case IDC_EDIT_TORRENT_FILE: 
 
				// pDC->SetBkMode(TRANSPARENT);  // make text 
				// pDC->SetTextColor(RGB(255,0,0)); // change the text color to red. 
				pDC->SetBkColor(::GetSysColor(COLOR_WINDOW)); 
 
				hbr = GetSysColorBrush(COLOR_WINDOW); // apply a null brush, so control's rectangle 
				// hbr = (HBRUSH) GetStockObject(WHITE_BRUSH); 
 
				 
				break; 
				// otherwise, do default handling of OnCtlColor 
			default: 
				hbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor); 
			} 
			 
			return hbr;    // return brush 
		} 
	} 
	 
	return hbr; 
}