00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "Downloads_Deleted.h"
00009 #include "DownloadsWnd.h"
00010
00011 extern CDownloadsWnd* _pwndDownloads;
00012
00013 #ifdef _DEBUG
00014 #undef THIS_FILE
00015 static char THIS_FILE[]=__FILE__;
00016 #define new DEBUG_NEW
00017 #endif
00018
00019 BEGIN_MESSAGE_MAP(CDownloads_Deleted, CListCtrlEx)
00020
00021 ON_WM_MEASUREITEM()
00022 ON_WM_DRAWITEM()
00023 ON_COMMAND(ID_DELETED_DELETE, OnDeletedDelete)
00024 ON_COMMAND(ID_DELETED_RESTORE, OnDeletedRestore)
00025 ON_WM_KEYDOWN()
00026
00027 END_MESSAGE_MAP()
00028
00029 CDownloads_Deleted::CDownloads_Deleted()
00030 {
00031
00032 }
00033
00034 CDownloads_Deleted::~CDownloads_Deleted()
00035 {
00036
00037 }
00038
00039 BOOL CDownloads_Deleted::Create(CWnd *pParent)
00040 {
00041 CRect rc (0, 0, 100, 100);
00042
00043 if (FALSE == CListCtrlEx::Create (LVS_REPORT|LVS_OWNERDRAWFIXED|LVS_SHOWSELALWAYS,
00044 rc, pParent, 0x5A9))
00045 return FALSE;
00046
00047 SetExtendedStyle (LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_INFOTIP);
00048
00049 m_images.Create (16, 17, ILC_COLOR24 | ILC_MASK, 7, 1);
00050 CBitmap bmp;
00051 bmp.Attach (SBMP (IDB_DOWNLOADSTASKS));
00052 m_images.Add (&bmp, RGB (255, 0, 255));
00053 SetImageList (&m_images, LVSIL_SMALL);
00054
00055 m_selimages.Create (16, 17, ILC_COLOR24 | ILC_MASK, 7, 1);
00056 CBitmap bmp2;
00057 bmp2.Attach (SBMP (IDB_DOWNLOADSTASKS_SEL));
00058 m_selimages.Add (&bmp2, RGB (255, 0, 255));
00059 SetSelectedImages (&m_selimages);
00060
00061 InsertColumn (0, "", LVCFMT_LEFT, 200, 0);
00062 InsertColumn (1, "", LVCFMT_LEFT, 50, 0);
00063 InsertColumn (2, "", LVCFMT_LEFT, 100, 0);
00064 InsertColumn (3, "", LVCFMT_LEFT, 58, 0);
00065 InsertColumn (4, "", LVCFMT_LEFT, 200, 0);
00066
00067 ReadState ("DownloadsDeleted");
00068
00069 return TRUE;
00070 }
00071
00072 void CDownloads_Deleted::ApplyLanguage()
00073 {
00074 SetColumnText (0, LS (L_FILENAME));
00075 SetColumnText (1, LS (L_SIZE));
00076 SetColumnText (2, LS (L_DOWNLOADED));
00077 SetColumnText (3, LS (L_SECTIONS));
00078 SetColumnText (4, LS (L_COMMENT));
00079 }
00080
00081 void CDownloads_Deleted::AddDownload(vmsDownloadSmartPtr dld)
00082 {
00083
00084 int iItem = AddItem ("", GetSysColor (COLOR_WINDOW), GetSysColor (COLOR_WINDOWTEXT), 0, TRUE);
00085
00086 SetItemData (iItem, (DWORD) (fsDownload*) dld);
00087
00088 UpdateDownload (iItem);
00089 }
00090
00091 void CDownloads_Deleted::RemoveDownload(vmsDownloadSmartPtr dld)
00092 {
00093 int iItem = FindDownload (dld);
00094 if (iItem != -1)
00095 DeleteItem (iItem);
00096 }
00097
00098 void CDownloads_Deleted::UpdateDownload(int iItem)
00099 {
00100 vmsDownloadSmartPtr dld = (fsDownload*)GetItemData (iItem);
00101
00102 CHAR szFile [10000];
00103 CDownloads_Tasks::GetFileName (dld, szFile);
00104 lstrcat (szFile, " (");
00105 lstrcat (szFile, dld->pMgr->get_URL ());
00106 lstrcat (szFile, ")");
00107 SetItemText (iItem, 0, szFile);
00108
00109 int cSects = dld->pMgr->GetNumberOfSections ();
00110 UINT64 uSize = dld->pMgr->GetLDFileSize ();
00111 UINT64 uDone = 0;
00112
00113 SetItemImage (iItem, GetDownloadImage (dld));
00114
00115 uDone = dld->pMgr->GetDownloadedBytesCount ();
00116
00117 CString str;
00118 CHAR szDim [10];
00119 float val;
00120
00121 if (cSects)
00122 {
00123 if (uSize != _UI64_MAX)
00124 {
00125 if (_pwndDownloads->IsSizesInBytes () == FALSE)
00126 {
00127 BytesToXBytes (uSize, &val, szDim);
00128 str.Format ("%.*g %s", val > 999 ? 4 : 3, val, szDim);
00129 }
00130 else
00131 {
00132 str = fsBytesToStr (uSize);
00133 }
00134 SetItemText (iItem, 1, str);
00135 }
00136 else
00137 SetItemText (iItem, 1, "?");
00138
00139 if (_pwndDownloads->IsSizesInBytes () == FALSE)
00140 {
00141 BytesToXBytes (uDone, &val, szDim);
00142 if (uSize != _UI64_MAX)
00143 str.Format ("%d%% [%.*g %s]", (int)((double)(INT64)uDone / (INT64)uSize * 100), val > 999 ? 4 : 3, val, szDim);
00144 else
00145 str.Format ("%.*g %s", val > 999 ? 4 : 3, val, szDim);
00146 }
00147 else
00148 {
00149 CString s = fsBytesToStr (uDone);
00150 if (uSize != _UI64_MAX)
00151 str.Format ("%d%% [%s]", (int)((double)(INT64)uDone / (INT64)uSize * 100), s);
00152 else
00153 str = s;
00154 }
00155 SetItemText (iItem, 2, str);
00156 }
00157 else
00158 {
00159 SetItemText (iItem, 1, "");
00160 SetItemText (iItem, 2, "");
00161 }
00162
00163 str.Format ("%d", cSects);
00164 SetItemText (iItem, 3, str);
00165
00166 str = dld->strComment;
00167 str.Replace ("\r", " ");
00168 str.Replace ("\n", " ");
00169 SetItemText (iItem, 4, str);
00170 }
00171
00172 int CDownloads_Deleted::FindDownload(vmsDownloadSmartPtr dld)
00173 {
00174 LVFINDINFO fi;
00175
00176 fi.flags = LVFI_PARAM;
00177 fi.lParam = (LPARAM)(fsDownload*) dld;
00178
00179 return CListCtrl::FindItem (&fi, -1);
00180 }
00181
00182 void CDownloads_Deleted::RemoveAll()
00183 {
00184 DeleteAllItems ();
00185 }
00186
00187 void CDownloads_Deleted::OnRClick()
00188 {
00189 CMenu menu;
00190 menu.LoadMenu (IDM_DELETEDITEMS);
00191 ApplyLanguageToMenu (&menu);
00192 CMenu *pPopup = menu.GetSubMenu (0);
00193
00194 if (GetSelectedCount () == 0)
00195 {
00196 pPopup->EnableMenuItem (ID_DELETED_RESTORE, MF_BYCOMMAND | MF_GRAYED);
00197 pPopup->EnableMenuItem (ID_DELETED_DELETE, MF_BYCOMMAND | MF_GRAYED);
00198 }
00199
00200 m_odmenu.Attach (&menu, FALSE);
00201
00202 CPoint pt (0,0);
00203 GetCursorPos (&pt);
00204 pPopup->TrackPopupMenu (TPM_RIGHTBUTTON | TPM_TOPALIGN | TPM_LEFTALIGN, pt.x, pt.y, this);
00205 m_odmenu.Detach ();
00206
00207 menu.DestroyMenu ();
00208 }
00209
00210 void CDownloads_Deleted::ApplyLanguageToMenu(CMenu *menu)
00211 {
00212 menu->ModifyMenu (ID_DELETED_RESTORE, MF_BYCOMMAND|MF_STRING, ID_DELETED_RESTORE, LS (L_RESTORE));
00213 menu->ModifyMenu (ID_DELETED_DELETE, MF_BYCOMMAND|MF_STRING, ID_DELETED_DELETE, LS (L_DELETE));
00214 }
00215
00216 void CDownloads_Deleted::OnMeasureItem(int , LPMEASUREITEMSTRUCT lpMeasureItemStruct)
00217 {
00218 m_odmenu.OnMeasureItem (lpMeasureItemStruct);
00219 }
00220
00221 void CDownloads_Deleted::OnDrawItem(int , LPDRAWITEMSTRUCT lpDrawItemStruct)
00222 {
00223 m_odmenu.OnDrawItem (lpDrawItemStruct);
00224 }
00225
00226 void CDownloads_Deleted::OnDeletedDelete()
00227 {
00228 DLDS_LIST v;
00229 POSITION pos = GetFirstSelectedItemPosition ();
00230 while (pos)
00231 {
00232 int iItem = GetNextSelectedItem (pos);
00233 vmsDownloadSmartPtr dld = (fsDownload*) GetItemData (iItem);
00234 v.push_back (dld);
00235 }
00236
00237 if (v.size ())
00238 {
00239 if (IDYES == MessageBox (LS (L_AREYOUSURE), LS (L_CONFIRMATION), MB_ICONQUESTION | MB_YESNO))
00240 {
00241 _pwndDownloads->m_wndDeleted.ShowWindow (SW_HIDE);
00242 try {
00243 _DldsMgr.DeleteDeletedDownloads (v);
00244 }
00245 catch (...) {}
00246 _pwndDownloads->m_wndDeleted.ShowWindow (SW_SHOW);
00247 }
00248 }
00249 }
00250
00251 void CDownloads_Deleted::OnDeletedRestore()
00252 {
00253 DLDS_LIST v;
00254 POSITION pos = GetFirstSelectedItemPosition ();
00255 while (pos)
00256 {
00257 int iItem = GetNextSelectedItem (pos);
00258 vmsDownloadSmartPtr dld = (fsDownload*) GetItemData (iItem);
00259 v.push_back (dld);
00260 }
00261
00262 if (v.size ())
00263 {
00264 _pwndDownloads->m_wndDeleted.ShowWindow (SW_HIDE);
00265 try {
00266 _DldsMgr.RestoreDownloads (v);
00267 }
00268 catch (...) {}
00269 _pwndDownloads->m_wndDeleted.ShowWindow (SW_SHOW);
00270 }
00271 }
00272
00273 void CDownloads_Deleted::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
00274 {
00275
00276 BOOL bCtrl = GetKeyState (VK_CONTROL) & 0x8000;
00277
00278 switch (nChar)
00279 {
00280 case 'A':
00281 if (bCtrl)
00282 {
00283 int cItems = GetItemCount ();
00284 for (int i = cItems-1; i >= 0; i--)
00285 SetItemState (i, LVIS_SELECTED, LVIS_SELECTED);
00286 return;
00287 }
00288 break;
00289 }
00290
00291 CListCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
00292 }
00293
00294 void CDownloads_Deleted::OnKeyDown(WORD wVK)
00295 {
00296 switch (wVK)
00297 {
00298 case VK_DELETE:
00299 OnDeletedDelete ();
00300 break;
00301
00302 case VK_TAB:
00303 _pwndDownloads->m_wndGroups.SetFocus ();
00304 break;
00305 }
00306 }
00307
00308 void CDownloads_Deleted::OnForceUpdate()
00309 {
00310 for (int i = 0; i < GetItemCount (); i++)
00311 {
00312 UpdateDownload (i);
00313 }
00314 }
00315
00316 int CDownloads_Deleted::GetDownloadImage(vmsDownloadSmartPtr dld)
00317 {
00318 if (dld->pMgr->IsDone ())
00319 return 1;
00320 else
00321 return 0;
00322 }
00323
00324 void CDownloads_Deleted::OnSortModeChanged()
00325 {
00326 if (m_sortMode != LCSM_ASCENDING)
00327 m_sortMode = LCSM_ASCENDING;
00328
00329 Sort ();
00330 }
00331
00332 void CDownloads_Deleted::Sort()
00333 {
00334 if (m_sortMode != LCSM_NONE)
00335 SortItems (_sortFunc, DWORD (this));
00336 else
00337 {
00338 DeleteAllItems ();
00339 for (int i = _DldsMgr.Get_DeletedDownloadCount () - 1; i >= 0; i--)
00340 AddDownload (_DldsMgr.Get_DeletedDownload (i));
00341 }
00342 }
00343
00344 int CALLBACK CDownloads_Deleted::_sortFunc(LPARAM item1, LPARAM item2, LPARAM lp)
00345 {
00346 CDownloads_Deleted* pThis = (CDownloads_Deleted*) lp;
00347 vmsDownloadSmartPtr dld1 = (fsDownload*) item1;
00348 vmsDownloadSmartPtr dld2 = (fsDownload*) item2;
00349
00350 switch (pThis->m_iSortCol)
00351 {
00352 case 0:
00353 char szFile1 [10000]; char szFile2 [10000];
00354 CDownloads_Tasks::GetFileName (dld1, szFile1);
00355 CDownloads_Tasks::GetFileName (dld2, szFile2);
00356 return stricmp (szFile1, szFile2);
00357
00358 case 1:
00359 UINT64 size1;
00360 UINT64 size2;
00361 size1 = dld1->pMgr->GetLDFileSize ();
00362 size2 = dld2->pMgr->GetLDFileSize ();
00363
00364 if (size1 == _UI64_MAX)
00365 return size2 == _UI64_MAX ? 0 : 1;
00366
00367 if (size2 == _UI64_MAX)
00368 return size1 == _UI64_MAX ? 0 : -1;
00369
00370 if (size1 == size2)
00371 return 0;
00372
00373 return size1 > size2 ? -1 : 1;
00374
00375 case 2:
00376 UINT64 done1;
00377 UINT64 done2;
00378 done1 = dld1->pMgr->GetDownloadedBytesCount ();
00379 done2 = dld2->pMgr->GetDownloadedBytesCount ();
00380
00381 if (done1 == done2)
00382 return 0;
00383
00384 return done1 > done2 ? -1 : 1;
00385
00386 case 3:
00387 UINT sects1, sects2;
00388
00389 sects1 = dld1->pMgr->GetNumberOfSections ();
00390 sects2 = dld2->pMgr->GetNumberOfSections ();
00391
00392 if (sects1 == sects2)
00393 return 0;
00394
00395 return sects1 > sects2 ? -1 : 1;
00396 }
00397
00398 return 0;
00399 }
00400
00401 void CDownloads_Deleted::SelectDownload(vmsDownloadSmartPtr dld)
00402 {
00403 int iItem = FindDownload (dld);
00404
00405 if (iItem == -1)
00406 return;
00407
00408 POSITION pos = GetFirstSelectedItemPosition ();
00409
00410 while (pos)
00411 SetItemState (GetNextSelectedItem (pos), 0, LVIS_SELECTED | LVIS_FOCUSED);
00412
00413
00414 SetItemState (iItem, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
00415 SetSelectionMark (iItem);
00416 EnsureVisible (iItem, FALSE);
00417 }