00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "Downloads_History.h"
00009 #include "DownloadsWnd.h"
00010 #include "WaitDlg.h"
00011
00012 extern CDownloadsWnd* _pwndDownloads;
00013
00014 #ifdef _DEBUG
00015 #undef THIS_FILE
00016 static char THIS_FILE[]=__FILE__;
00017 #define new DEBUG_NEW
00018 #endif
00019
00020 BEGIN_MESSAGE_MAP(CDownloads_History, CListCtrlEx)
00021
00022 ON_WM_DRAWITEM()
00023 ON_WM_MEASUREITEM()
00024 ON_COMMAND(ID_URLTOCLIPBOARD, OnUrltoclipboard)
00025 ON_COMMAND(ID_LAUNCH, OnLaunch)
00026 ON_COMMAND(ID_OPENFOLDER, OnOpenfolder)
00027 ON_WM_LBUTTONDBLCLK()
00028 ON_COMMAND(ID_HSTITEM_DELETE, OnHstitemDelete)
00029
00030 END_MESSAGE_MAP()
00031
00032 CDownloads_History::CDownloads_History()
00033 {
00034
00035 }
00036
00037 CDownloads_History::~CDownloads_History()
00038 {
00039
00040 }
00041
00042 BOOL CDownloads_History::Create(CWnd *pParent)
00043 {
00044 CRect rc (0, 0, 100, 100);
00045
00046 m_mgr = &_DldsMgr.m_histmgr;
00047
00048
00049 if (FALSE == CListCtrlEx::Create (LVS_REPORT|LVS_OWNERDRAWFIXED|LVS_SHOWSELALWAYS,
00050 rc, pParent, 0x5d9))
00051 return FALSE;
00052
00053 SetExtendedStyle (LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_INFOTIP);
00054
00055 m_images.Create (16, 17, ILC_COLOR24 | ILC_MASK, 7, 1);
00056 CBitmap bmp;
00057 bmp.Attach (SBMP (IDB_DOWNLOADSTASKS));
00058 m_images.Add (&bmp, RGB (255, 0, 255));
00059 SetImageList (&m_images, LVSIL_SMALL);
00060
00061 m_selimages.Create (16, 17, ILC_COLOR24 | ILC_MASK, 7, 1);
00062 CBitmap bmp2;
00063 bmp2.Attach (SBMP (IDB_DOWNLOADSTASKS_SEL));
00064 m_selimages.Add (&bmp2, RGB (255, 0, 255));
00065 SetSelectedImages (&m_selimages);
00066
00067 InsertColumn (0, "file", LVCFMT_LEFT, 100, 0);
00068 InsertColumn (1, "url", LVCFMT_LEFT, 100, 0);
00069 InsertColumn (2, "added", LVCFMT_LEFT, 80, 0);
00070 InsertColumn (3, "dlded", LVCFMT_LEFT, 80, 0);
00071 InsertColumn (4, "size", LVCFMT_LEFT, 80, 0);
00072 InsertColumn (5, "savedto", LVCFMT_LEFT, 100, 0);
00073 InsertColumn (6, "comment", LVCFMT_LEFT, 90, 0);
00074
00075 ReadState ("DownloadsHistory");
00076
00077 return TRUE;
00078 }
00079
00080 void CDownloads_History::ApplyLanguage()
00081 {
00082 SetColumnText (0, LS (L_FILE));
00083 SetColumnText (1, "URL");
00084 SetColumnText (2, LS (L_ADDED));
00085 SetColumnText (3, LS (L_DOWNLOADED));
00086 SetColumnText (4, LS (L_SIZE));
00087 SetColumnText (5, LS (L_SAVEDTO));
00088 SetColumnText (6, LS (L_COMMENT));
00089 }
00090
00091 void CDownloads_History::AddRecord(fsDLHistoryRecord *rec)
00092 {
00093 m_mxAddDel.Lock ();
00094
00095 int iItem = AddItem ("", GetSysColor (COLOR_WINDOW), GetSysColor (COLOR_WINDOWTEXT), 0, TRUE);
00096
00097 SetItemData (iItem, (DWORD) rec);
00098
00099 UpdateRecord (iItem);
00100
00101 m_mxAddDel.Unlock ();
00102 }
00103
00104 void CDownloads_History::DeleteRecord(fsDLHistoryRecord *rec)
00105 {
00106 m_mxAddDel.Lock ();
00107 int iItem = FindRecord (rec);
00108 if (iItem != -1)
00109 DeleteItem (iItem);
00110 m_mxAddDel.Unlock ();
00111 }
00112
00113 void CDownloads_History::DeleteAllRecords()
00114 {
00115 m_mxAddDel.Lock ();
00116 DeleteAllItems ();
00117 m_mxAddDel.Unlock ();
00118 }
00119
00120 void CDownloads_History::UpdateRecord(int iItem)
00121 {
00122 fsDLHistoryRecord *rec = (fsDLHistoryRecord*) GetItemData (iItem);
00123 SetItemText (iItem, 0, rec->strFileName);
00124
00125 SetItemText (iItem, 1, rec->strURL);
00126
00127 char sz [1000];
00128
00129 FileTimeToStr (&rec->dateAdded, sz, NULL);
00130 SetItemText (iItem, 2, sz);
00131
00132 if (rec->dateDownloaded.dwHighDateTime != 0)
00133 {
00134 FileTimeToStr (&rec->dateDownloaded, sz, NULL);
00135 SetItemText (iItem, 3, sz);
00136 }
00137 else
00138 {
00139 CString str = LS (L_WASDELETED_);
00140 FileTimeToStr (&rec->dateRecordAdded, sz, NULL);
00141 str += " (";
00142 str += sz;
00143 str += ')';
00144 SetItemText (iItem, 3, str);
00145 }
00146
00147 CString str;
00148 if (rec->uFileSize != _UI64_MAX)
00149 {
00150 if (FALSE == _pwndDownloads->IsSizesInBytes ())
00151 {
00152 float val;
00153 char szDim [10];
00154 BytesToXBytes (rec->uFileSize, &val, szDim);
00155 str.Format ("%.*g %s", val > 999 ? 4 : 3, val, szDim);
00156 }
00157 else
00158 str = fsBytesToStr (rec->uFileSize);
00159 }
00160 else
00161 str = LS (L_UNKNOWN);
00162
00163 SetItemText (iItem, 4, str);
00164
00165 SetItemText (iItem, 5, rec->strSavedTo);
00166
00167 str = rec->strComment;
00168 str.Replace ("\r", " ");
00169 str.Replace ("\n", " ");
00170 SetItemText (iItem, 6, str);
00171
00172 SetItemImage (iItem, GetRecordImage (rec));
00173 }
00174
00175 int CDownloads_History::FindRecord(fsDLHistoryRecord *rec)
00176 {
00177 LVFINDINFO fi;
00178
00179 fi.flags = LVFI_PARAM;
00180 fi.lParam = (LPARAM) rec;
00181
00182 return CListCtrl::FindItem (&fi, -1);
00183 }
00184
00185 void CDownloads_History::OnForceUpdate()
00186 {
00187 for (int i = 0; i < GetItemCount (); i++)
00188 {
00189 UpdateRecord (i);
00190 }
00191 }
00192
00193 void CDownloads_History::ApplyFilter(fsDldHistRecFilter* filter)
00194 {
00195 if (filter == NULL)
00196 {
00197 DeleteAllRecords ();
00198 return;
00199 }
00200
00201 if (m_mgr->GetRecordCount () < 600)
00202 ApplyFilter_imp (filter);
00203 else
00204 {
00205
00206 CWaitDlg dlg;
00207 dlg.StartWaiting (LS (L_BUILDINGLISTOFHISTORY), _threadApplyFilter, FALSE, this, filter);
00208 }
00209 }
00210
00211 void CDownloads_History::ApplyFilter_imp(fsDldHistRecFilter *f, int *piProgress)
00212 {
00213 DeleteAllRecords ();
00214
00215 ShowWindow (SW_HIDE);
00216
00217 try {
00218 int cRecs = m_mgr->GetRecordCount ();
00219 for (int i = cRecs-1; i >= 0; i--)
00220 {
00221 fsDLHistoryRecord* rec = m_mgr->GetRecord (i);
00222 if (f->IsSatisfies (rec))
00223 AddRecord (rec);
00224
00225 if (piProgress)
00226 *piProgress = int (float (cRecs-i) / cRecs * 100);
00227
00228 }
00229 } catch (...) {}
00230
00231 ShowWindow (SW_SHOW);
00232 }
00233
00234 DWORD WINAPI CDownloads_History::_threadApplyFilter(LPVOID lp)
00235 {
00236 ProcWaitInfo *info = (ProcWaitInfo*) lp;
00237 CDownloads_History* pThis = (CDownloads_History*) info->lpParam1;
00238 fsDldHistRecFilter *f = (fsDldHistRecFilter*) info->lpParam2;
00239 pThis->ApplyFilter_imp (f, &info->iProgress);
00240 info->bWaitDone = TRUE;
00241 return 0;
00242 }
00243
00244 int CDownloads_History::GetRecordImage(fsDLHistoryRecord *rec)
00245 {
00246 if (rec->dateDownloaded.dwHighDateTime != 0)
00247 return 1;
00248 else
00249 return 6;
00250 }
00251
00252 void CDownloads_History::SelectRecord(fsDLHistoryRecord *rec)
00253 {
00254 int iItem = FindRecord (rec);
00255
00256 if (iItem == -1)
00257 return;
00258
00259 POSITION pos = GetFirstSelectedItemPosition ();
00260
00261 while (pos)
00262 SetItemState (GetNextSelectedItem (pos), 0, LVIS_SELECTED | LVIS_FOCUSED);
00263
00264
00265 SetItemState (iItem, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
00266 SetSelectionMark (iItem);
00267 EnsureVisible (iItem, FALSE);
00268 }
00269
00270 void CDownloads_History::OnRClick()
00271 {
00272 CMenu menu;
00273 menu.LoadMenu (IDM_HISTORYITEMS);
00274 ApplyLanguageToMenu (&menu);
00275 CMenu *pPopup = menu.GetSubMenu (0);
00276
00277 if (GetSelectedCount () != 1)
00278 {
00279 pPopup->EnableMenuItem (ID_LAUNCH, MF_BYCOMMAND | MF_GRAYED);
00280 pPopup->EnableMenuItem (ID_OPENFOLDER, MF_BYCOMMAND | MF_GRAYED);
00281 pPopup->EnableMenuItem (ID_URLTOCLIPBOARD, MF_BYCOMMAND | MF_GRAYED);
00282 }
00283
00284 if (GetSelectedCount () == 0)
00285 pPopup->EnableMenuItem (ID_HSTITEM_DELETE, MF_BYCOMMAND | MF_GRAYED);
00286
00287 m_odmenu.Attach (&menu, FALSE);
00288
00289 CPoint pt (0,0);
00290 GetCursorPos (&pt);
00291 pPopup->TrackPopupMenu (TPM_RIGHTBUTTON | TPM_TOPALIGN | TPM_LEFTALIGN, pt.x, pt.y, this);
00292 m_odmenu.Detach ();
00293
00294 menu.DestroyMenu ();
00295 }
00296
00297 void CDownloads_History::ApplyLanguageToMenu(CMenu *menu)
00298 {
00299 menu->ModifyMenu (ID_LAUNCH, MF_BYCOMMAND|MF_STRING, ID_LAUNCH, LS (L_LAUNCHFILE));
00300 menu->ModifyMenu (ID_OPENFOLDER, MF_BYCOMMAND|MF_STRING, ID_OPENFOLDER, LS (L_OPENFOLDER));
00301 menu->ModifyMenu (ID_URLTOCLIPBOARD, MF_BYCOMMAND|MF_STRING, ID_URLTOCLIPBOARD, LS (L_URLTOCLIPBOARD));
00302
00303 CString str = LS (L_DELETERECORD); str += "\tDel";
00304 menu->ModifyMenu (ID_HSTITEM_DELETE, MF_BYCOMMAND|MF_STRING, ID_HSTITEM_DELETE, str);
00305 }
00306
00307 void CDownloads_History::OnDrawItem(int , LPDRAWITEMSTRUCT lpDrawItemStruct)
00308 {
00309 m_odmenu.OnDrawItem (lpDrawItemStruct);
00310 }
00311
00312 void CDownloads_History::OnMeasureItem(int , LPMEASUREITEMSTRUCT lpMeasureItemStruct)
00313 {
00314 m_odmenu.OnMeasureItem (lpMeasureItemStruct);
00315 }
00316
00317 void CDownloads_History::OnUrltoclipboard()
00318 {
00319 fsDLHistoryRecord* rec = get_SelectedRecord ();
00320 _ClipbrdMgr.Text (rec->strURL);
00321 }
00322
00323 void CDownloads_History::OnSortModeChanged()
00324 {
00325 if (m_sortMode != LCSM_ASCENDING)
00326 m_sortMode = LCSM_ASCENDING;
00327
00328 Sort ();
00329 }
00330
00331 void CDownloads_History::Sort()
00332 {
00333 if (m_sortMode != LCSM_NONE)
00334 SortItems (_sortFunc, DWORD (this));
00335 else
00336 {
00337 _pwndDownloads->ApplyHistoryCurrentFilter ();
00338 }
00339 }
00340
00341 int CALLBACK CDownloads_History::_sortFunc(LPARAM item1, LPARAM item2, LPARAM lp)
00342 {
00343 CDownloads_History* pThis = (CDownloads_History*) lp;
00344 fsDLHistoryRecord* rec1 = (fsDLHistoryRecord*) item1;
00345 fsDLHistoryRecord* rec2 = (fsDLHistoryRecord*) item2;
00346
00347 switch (pThis->m_iSortCol)
00348 {
00349 case 0:
00350 return stricmp (rec1->strFileName, rec2->strFileName);
00351
00352 case 1:
00353 return stricmp (rec1->strURL, rec2->strURL);
00354
00355 case 2:
00356 return CompareFileTime (&rec2->dateAdded, &rec1->dateAdded);
00357
00358 case 3:
00359 if (rec1->dateDownloaded.dwHighDateTime == 0 && rec2->dateDownloaded.dwHighDateTime == 0)
00360 return 0;
00361
00362 if (rec2->dateDownloaded.dwHighDateTime == 0)
00363 return -1;
00364
00365 if (rec1->dateDownloaded.dwHighDateTime == 0)
00366 return 1;
00367
00368 return CompareFileTime (&rec2->dateDownloaded, &rec1->dateDownloaded);
00369
00370 case 4:
00371 UINT64 size1;
00372 UINT64 size2;
00373 size1 = rec1->uFileSize;
00374 size2 = rec2->uFileSize;
00375
00376 if (size1 == _UI64_MAX)
00377 return size2 == _UI64_MAX ? 0 : 1;
00378
00379 if (size2 == _UI64_MAX)
00380 return size1 == _UI64_MAX ? 0 : -1;
00381
00382 if (size1 == size2)
00383 return 0;
00384
00385 return size1 > size2 ? -1 : 1;
00386
00387 case 5:
00388 return stricmp (rec1->strSavedTo, rec2->strSavedTo);
00389 }
00390
00391 return 0;
00392 }
00393
00394 void CDownloads_History::OnLaunch()
00395 {
00396 fsDLHistoryRecord* rec = get_SelectedRecord ();
00397 if (rec)
00398 ShellExecute (::GetDesktopWindow (), "open", rec->strSavedTo, NULL, NULL, SW_SHOW);
00399 }
00400
00401 void CDownloads_History::OnOpenfolder()
00402 {
00403 fsDLHistoryRecord* rec = get_SelectedRecord ();
00404
00405 if (GetFileAttributes (rec->strSavedTo) == DWORD (-1))
00406 {
00407 char szPath [MY_MAX_PATH];
00408 fsGetPath (rec->strSavedTo, szPath);
00409 ShellExecute (m_hWnd, "explore", szPath, NULL, NULL, SW_SHOW);
00410 }
00411 else
00412 {
00413 CString strCmd;
00414 strCmd.Format ("/select,\"%s\"", rec->strSavedTo);
00415 ShellExecute (m_hWnd, "open", "explorer.exe", strCmd, NULL, SW_SHOW);
00416 }
00417 }
00418
00419 fsDLHistoryRecord* CDownloads_History::get_SelectedRecord()
00420 {
00421 POSITION pos = GetFirstSelectedItemPosition ();
00422 if (pos == NULL)
00423 return NULL;
00424
00425 int iItem = GetNextSelectedItem (pos);
00426
00427 return (fsDLHistoryRecord*) GetItemData (iItem);
00428 }
00429
00430 void CDownloads_History::OnLButtonDblClk(UINT nFlags, CPoint point)
00431 {
00432 OnLaunch ();
00433 CListCtrlEx::OnLButtonDblClk(nFlags, point);
00434 }
00435
00436 void CDownloads_History::OnHstitemDelete()
00437 {
00438 POSITION pos = GetFirstSelectedItemPosition ();
00439 fs::list <fsDLHistoryRecord*> v;
00440
00441 while (pos)
00442 {
00443 int i = GetNextSelectedItem (pos);
00444 v.add ((fsDLHistoryRecord*) GetItemData (i));
00445 }
00446
00447 if (IDCANCEL == MessageBox (LS (L_ISOKTODELETE), LS (L_CONFIRMATION),
00448 MB_ICONQUESTION | MB_OKCANCEL))
00449 {
00450 SetFocus ();
00451 return;
00452 }
00453
00454 ShowWindow (SW_HIDE);
00455
00456 try {
00457
00458 for (int i = 0; i < v.size (); i++)
00459 _DldsMgr.m_histmgr.DeleteRecord (v [i]);
00460
00461 }catch (...) {}
00462
00463 ShowWindow (SW_SHOW);
00464 SetFocus ();
00465 }
00466
00467 void CDownloads_History::OnKeyDown(WORD wVK)
00468 {
00469 switch (wVK)
00470 {
00471 case VK_DELETE:
00472 OnHstitemDelete ();
00473 break;
00474 }
00475 }