00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "FloatingInfoWnd.h"
00009 #include "DownloadsWnd.h"
00010
00011 extern CDownloadsWnd* _pwndDownloads;
00012
00013 #ifdef _DEBUG
00014 #define new DEBUG_NEW
00015 #undef THIS_FILE
00016 static char THIS_FILE[] = __FILE__;
00017 #endif
00018
00019 IMPLEMENT_DYNCREATE(CFloatingInfoWnd, CFrameWnd)
00020
00021 CFloatingInfoWnd::CFloatingInfoWnd()
00022 {
00023 m_cxPercent = 0;
00024 m_cxSpeed = 0;
00025 m_bNeedToShow = FALSE;
00026 m_bWasFS = FALSE;
00027 m_bHideAlways = FALSE;
00028 }
00029
00030 CFloatingInfoWnd::~CFloatingInfoWnd()
00031 {
00032 }
00033
00034 BEGIN_MESSAGE_MAP(CFloatingInfoWnd, CFrameWnd)
00035
00036 ON_WM_CREATE()
00037 ON_WM_CLOSE()
00038 ON_WM_SIZE()
00039 ON_WM_GETMINMAXINFO()
00040 ON_WM_TIMER()
00041
00042 END_MESSAGE_MAP()
00043
00044 int CFloatingInfoWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
00045 {
00046 if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
00047 return -1;
00048
00049 m_drop.Register (this);
00050
00051 CRect rc (0, 0, 50, 50);
00052
00053 if (FALSE == m_wndList.Create (LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_OWNERDRAWFIXED,
00054 rc, this, 0x76329))
00055 return FALSE;
00056
00057 m_imgsList.Create (13, 13, ILC_MASK | ILC_COLOR24, 2, 1);
00058 CBitmap bmp; bmp.Attach (SBMP (IDB_DLDSINFO));
00059 m_imgsList.Add (&bmp, RGB (255, 0, 255));
00060 m_wndList.SetImageList (&m_imgsList, LVSIL_SMALL);
00061
00062 m_imgsList_sel.Create (13, 13, ILC_MASK | ILC_COLOR24, 2, 1);
00063 CBitmap bmp2; bmp2.Attach (SBMP (IDB_DLDSINFO_SEL));
00064 m_imgsList_sel.Add (&bmp2, RGB (255, 0, 255));
00065 m_wndList.SetSelectedImages (&m_imgsList_sel);
00066
00067 m_wndList.SetExtendedStyle (LVS_EX_FULLROWSELECT|LVS_EX_INFOTIP);
00068
00069 m_wndList.InsertColumn (0, "", LVCFMT_LEFT, 100, 0);
00070 m_wndList.InsertColumn (1, "", LVCFMT_RIGHT, 50, 0);
00071 m_wndList.InsertColumn (2, "", LVCFMT_RIGHT, 50, 0);
00072
00073 m_wndList.Initialize ();
00074
00075 m_wndList.ShowWindow (SW_SHOW);
00076
00077 m_cxPercent = m_wndList.GetStringWidth ("100%") + 5;
00078 m_cxSpeed = m_wndList.GetStringWidth ("9999.9 KB/s") + 5;
00079
00080 SetTimer (1, 1000, NULL);
00081 SetTimer (2, 500, NULL);
00082
00083 return 0;
00084 }
00085
00086 BOOL CFloatingInfoWnd::Create()
00087 {
00088 int cx = GetSystemMetrics (SM_CXSCREEN);
00089 int cy = GetSystemMetrics (SM_CYSCREEN);
00090 RECT rc = {cx - 40 - 150, cy - 40 - 100, cx - 40, cy - 40};
00091
00092 DWORD dwLStyle = fsSysGetOsMajorVersion () < 5 ? 0 : WS_EX_LAYERED;
00093
00094 if (FALSE == CFrameWnd::CreateEx (WS_EX_TOPMOST|WS_EX_TOOLWINDOW|dwLStyle,
00095 AfxRegisterWndClass (CS_DBLCLKS, LoadCursor (NULL, IDC_ARROW), (HBRUSH)(COLOR_WINDOW+1), NULL),
00096 LS (L_ACTIVEDLDS),
00097 WS_OVERLAPPED|WS_CLIPSIBLINGS|WS_SYSMENU|WS_THICKFRAME,
00098 rc, NULL, 0))
00099 return FALSE;
00100
00101 SetBlend (_App.DownloadsInfoWndBlend ());
00102
00103 _App.View_ReadWndPlacement (this, "FloatingInfoWnd", TRUE);
00104
00105 return TRUE;
00106 }
00107
00108 void CFloatingInfoWnd::OnClose()
00109 {
00110 TurnOffWindow ();
00111 }
00112
00113 void CFloatingInfoWnd::OnSize(UINT , int cx, int cy)
00114 {
00115 m_wndList.MoveWindow (0, 0, cx, cy);
00116
00117 m_cxPercent = m_wndList.GetStringWidth ("100%") + 5;
00118 m_cxSpeed = m_wndList.GetStringWidth ("9999.9 KB/s") + 5;
00119
00120 m_wndList.SetColumnWidth (0, cx - m_cxPercent - m_cxSpeed );
00121 m_wndList.SetColumnWidth (1, m_cxPercent);
00122 m_wndList.SetColumnWidth (2, m_cxSpeed);
00123 }
00124
00125 void CFloatingInfoWnd::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
00126 {
00127 CFrameWnd::OnGetMinMaxInfo(lpMMI);
00128 lpMMI->ptMinTrackSize.x = m_cxPercent + m_cxSpeed + 10 + GetSystemMetrics (SM_CXVSCROLL) +
00129 2 * GetSystemMetrics (SM_CXBORDER);
00130 lpMMI->ptMinTrackSize.y = 30;
00131 }
00132
00133 void CFloatingInfoWnd::RebuildList()
00134 {
00135 if (IsWindow (m_wndList) == FALSE)
00136 return;
00137
00138 m_mxList.Lock ();
00139
00140 m_wndList.DeleteAllItems ();
00141
00142 try{
00143
00144 DLDS_LIST v;
00145
00146 for (size_t i = 0; i < _DldsMgr.GetCount (); i++)
00147 {
00148 vmsDownloadSmartPtr dld = _DldsMgr.GetDownload (i);
00149 if (dld->pMgr->IsRunning ())
00150 AddDownloadToList (dld, false);
00151 if (dld->pMgr->IsBittorrent () &&
00152 dld->pMgr->GetBtDownloadMgr ()->GetUploadSpeed ())
00153 v.push_back (dld);
00154 }
00155
00156 for (i = 0; i < v.size (); i++)
00157 AddDownloadToList (v [i], true);
00158
00159 }
00160 catch (...) {}
00161
00162 m_mxList.Unlock ();
00163 }
00164
00165 void CFloatingInfoWnd::AddDownloadToList(vmsDownloadSmartPtr dld, bool bUploadInfo)
00166 {
00167 char szFile [MY_MAX_PATH];
00168 CDownloads_Tasks::GetFileName (dld, szFile);
00169
00170 m_mxList.Lock ();
00171
00172 int iItem = m_wndList.GetItemCount ();
00173
00174 m_wndList.AddItem (szFile, GetSysColor (COLOR_WINDOW),
00175 GetSysColor (COLOR_WINDOWTEXT), bUploadInfo ? 1 : 0);
00176 m_wndList.SetItemData (iItem, (ULONG)(fsDownload*)dld);
00177
00178 m_mxList.Unlock ();
00179
00180 UpdateDownloadProgress (iItem);
00181 UpdateDownloadSpeed (iItem);
00182 }
00183
00184 void CFloatingInfoWnd::UpdateDownloadProgress(int nItem)
00185 {
00186 CString str;
00187 bool bUpload = m_wndList.GetItemImage (nItem) == 1;
00188 if (bUpload == false)
00189 str.Format ("%d%%", (int)((fsDownload*) m_wndList.GetItemData (nItem))->pMgr->GetPercentDone ());
00190 m_wndList.SetItemText (nItem, 1, str);
00191 }
00192
00193 int CFloatingInfoWnd::FindIndex(vmsDownloadSmartPtr dld)
00194 {
00195 LVFINDINFO fi;
00196
00197 fi.flags = LVFI_PARAM;
00198 fi.lParam = (LPARAM)(fsDownload*) dld;
00199
00200 return m_wndList.FindItem (&fi);
00201 }
00202
00203 void CFloatingInfoWnd::OnTimer(UINT nIDEvent)
00204 {
00205 if (nIDEvent == 2)
00206 {
00207 KillTimer (2);
00208 RebuildList ();
00209 return;
00210 }
00211
00212 try {
00213
00214 for (int i = 0; i < m_wndList.GetItemCount (); i++)
00215 {
00216 UpdateDownloadProgress (i);
00217 UpdateDownloadSpeed (i);
00218 }
00219
00220 }
00221 catch (...) {}
00222
00223 BOOL bFS = fsIsSystemInFullScreenMode ();
00224 if (!m_bWasFS != !bFS)
00225 {
00226 m_bWasFS = bFS;
00227
00228 if (bFS && IsWindowVisible () && _App.FloatingWndsHideInFSMode ())
00229 ShowWindow (SW_HIDE);
00230 else if (bFS == FALSE && m_bNeedToShow && IsWindowVisible () == FALSE && m_bHideAlways == FALSE)
00231 ShowWindow (SW_SHOW);
00232 }
00233
00234 CFrameWnd::OnTimer(nIDEvent);
00235 }
00236
00237 void CFloatingInfoWnd::SaveState()
00238 {
00239 _App.View_SaveWndPlacement (this, "FloatingInfoWnd");
00240 }
00241
00242 void CFloatingInfoWnd::NeedToShow(BOOL b)
00243 {
00244 b = b && m_bHideAlways == FALSE;
00245
00246 m_bNeedToShow = b;
00247
00248 if (b == FALSE || fsIsSystemInFullScreenMode () == FALSE || _App.FloatingWndsHideInFSMode () == FALSE)
00249 ShowWindow (b ? SW_SHOW : SW_HIDE);
00250 }
00251
00252 void CFloatingInfoWnd::UpdateDownloadSpeed(int nItem)
00253 {
00254 CString str;
00255 CHAR szDim [10];
00256 float val;
00257
00258 bool bUpload = m_wndList.GetItemImage (nItem) == 1;
00259
00260 fsDownload *dld = (fsDownload*)m_wndList.GetItemData (nItem);
00261
00262 BytesToXBytes (bUpload ? dld->pMgr->GetBtDownloadMgr ()->GetUploadSpeed () :
00263 dld->pMgr->GetSpeed (), &val, szDim);
00264 str.Format ("%.*g %s/s", val > 999 ? 4 : 3, val, szDim);
00265 m_wndList.SetItemText (nItem, 2, str);
00266 }
00267
00268 void CFloatingInfoWnd::TurnOffWindow()
00269 {
00270 _App.View_FloatingInfoWindow (FALSE);
00271 NeedToShow (FALSE);
00272 ShowWindow (SW_HIDE);
00273 }
00274
00275 void CFloatingInfoWnd::SetBlend (BYTE val)
00276 {
00277 m_blend = val;
00278 if (fsSysGetOsMajorVersion () >= 5)
00279 fsSetLayeredWindowAttributes (m_hWnd, 0, m_blend, LWA_ALPHA);
00280 }
00281
00282 void CFloatingInfoWnd::HideAlways()
00283 {
00284 m_bHideAlways = TRUE;
00285 NeedToShow (FALSE);
00286 }