void CQueueListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { #define LIST_CELL_PADDING 6 //should be even number if (!g_App.m_pMDlg->IsRunning() || !lpDrawItemStruct->itemData) return; CDC *odc = CDC::FromHandle(lpDrawItemStruct->hDC); BOOL bCtrlFocused = ((GetFocus() == this) || (GetStyle() & LVS_SHOWSELALWAYS)); COLORREF crBk, crWinBk; crWinBk = crBk = GetBkColor(); if (lpDrawItemStruct->itemState & ODS_SELECTED) crBk = (bCtrlFocused) ? m_crHighlight : m_crNoHighlight; CUpDownClient *pClient = reinterpret_cast<CUpDownClient*>(lpDrawItemStruct->itemData); CMemDC dc(odc, &lpDrawItemStruct->rcItem, crWinBk, crBk); CFont *pOldFont = dc.SelectObject(GetFont()); COLORREF crOldTextColor = dc->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT)); int iWidth, iColumn; bool bMeasuring = (m_iMeasuringColumn >= 0); UINT iCalcFlag = bMeasuring ? (DT_LEFT|DT_SINGLELINE|DT_VCENTER|DT_NOPREFIX|DT_NOCLIP|DT_CALCRECT) : (DT_LEFT|DT_SINGLELINE|DT_VCENTER|DT_NOPREFIX|DT_NOCLIP|DT_END_ELLIPSIS); if (IsRightToLeftLanguage()) iCalcFlag |= DT_RTLREADING; RECT r = lpDrawItemStruct->rcItem; CString strBuffer; CKnownFile *pKnownFile = g_App.m_pSharedFilesList->GetFileByID(pClient->m_reqFileHash); CHeaderCtrl *pHeaderCtrl = GetHeaderCtrl(); int iNumColumns = pHeaderCtrl->GetItemCount(); r.right = r.left - LIST_CELL_PADDING / 2; r.left += LIST_CELL_PADDING / 2; iWidth = LIST_CELL_PADDING; for (int iCurrent = 0; iCurrent < iNumColumns; iCurrent++) { iColumn = pHeaderCtrl->OrderToIndex(iCurrent); if (IsColumnHidden(iColumn) || (bMeasuring && iColumn != m_iMeasuringColumn)) continue; r.right += CListCtrl::GetColumnWidth(iColumn); switch (iColumn) { case QLCOL_USERNAME: { if (!bMeasuring) { POINT point = {r.left, r.top + 1}; int iImgLstIdx = CLIENT_IMGLST_PLAIN; // Select corresponding image list depending on client properties if (pClient->IsBanned()) iImgLstIdx = CLIENT_IMGLST_BANNED; else if (pClient->IsFriend()) iImgLstIdx = CLIENT_IMGLST_FRIEND; else if (pClient->m_pCredits->HasHigherScoreRatio(pClient->GetIP())) iImgLstIdx = CLIENT_IMGLST_CREDITUP; // Display Client icon g_App.m_pMDlg->m_clientImgLists[iImgLstIdx].Draw(dc, pClient->GetClientIconIndex(), point, ILD_NORMAL); r.left += 20; if (g_App.m_pIP2Country->ShowCountryFlag()) { point.x += 20; point.y += 2; g_App.m_pIP2Country->GetFlagImageList()->Draw(dc, pClient->GetCountryIndex(), point, ILD_NORMAL); r.left += 22; } } else { iWidth += 20; if (g_App.m_pIP2Country->ShowCountryFlag()) iWidth += 22; } strBuffer = pClient->GetUserName(); break; } case QLCOL_FILENAME: if (pKnownFile) strBuffer = pKnownFile->GetFileName(); else strBuffer = _T("?"); break; case QLCOL_FILEPRIORITY: { if (pKnownFile) { UINT dwResStrId; switch (pKnownFile->GetULPriority()) { case PR_RELEASE: dwResStrId = IDS_PRIORELEASE; break; case PR_HIGH: dwResStrId = IDS_PRIOHIGH; break; case PR_LOW: dwResStrId = IDS_PRIOLOW; break; case PR_VERYLOW: dwResStrId = IDS_PRIOVERYLOW; break; default: dwResStrId = IDS_PRIONORMAL; break; } GetResString(&strBuffer, dwResStrId); } else strBuffer = _T("?"); break; } case QLCOL_PARTS: if (pClient->GetUpPartCount()) strBuffer.Format(_T("%u/%u"), pClient->GetAvailUpPartCount(), pClient->GetUpPartCount()); else strBuffer = _T(""); break; case QLCOL_PROGRESS: { if (pClient->GetUpPartCount() && g_App.m_pPrefs->IsUploadPartsEnabled()) { if (!bMeasuring) { RECT r2; r2.bottom = r.bottom - 1; r2.top = r.top + 1; r2.right = r.right + LIST_CELL_PADDING / 2; r2.left = r.left - LIST_CELL_PADDING / 2; pClient->DrawUpStatusBar(dc, &r2, g_App.m_pPrefs->UseFlatBar()); } iWidth = 300; } break; } case QLCOL_QLRATING: strBuffer.Format(_T("%u"), pClient->GetScore(true)); break; case QLCOL_SCORE: // Note: actually the client, which is downloading from us should be not in WaitingQueue if (pClient->IsDownloading()) strBuffer = _T("-"); else strBuffer.Format((pClient->IsAddNextConnect()) ? _T("%u*") : _T("%u"), pClient->GetScore()); break; case QLCOL_SFRATIO: if (pKnownFile != NULL) strBuffer.Format(_T("%.2f"), pKnownFile->GetSizeRatio()); else strBuffer = _T("-"); break; case QLCOL_RFRATIO: if (pKnownFile != NULL) strBuffer.Format(_T("%.2f"), pKnownFile->GetPopularityRatio()); else strBuffer = _T("-"); break; case QLCOL_TIMESASKED: strBuffer.Format(_T("%u"), pClient->GetAskedCount()); break; case QLCOL_LASTSEEN: strBuffer = CastSecondsToHM((GetTickCount() - pClient->GetLastUpRequest())/1000); break; case QLCOL_ENTEREDQUEUE: strBuffer = CastSecondsToHM((GetTickCount() - pClient->GetWaitStartTime())/1000); break; case QLCOL_BANNED: strBuffer = YesNoStr(pClient->IsBanned()); break; case QLCOL_COUNTRY: strBuffer = pClient->GetCountryName(); break; } if (iColumn != QLCOL_PROGRESS) { dc->DrawText(strBuffer, &r, iCalcFlag); if (bMeasuring && !strBuffer.IsEmpty()) iWidth += r.right - r.left + 1; } r.left = r.right + LIST_CELL_PADDING; if (bMeasuring) { // Pin the column widths at some reasonable value if (iWidth < 40) iWidth = 40; if (iWidth > m_iColumnMaxWidths[m_iMeasuringColumn]) m_iColumnMaxWidths[m_iMeasuringColumn] = iWidth; } } // Draw rectangle around selected item(s) if (lpDrawItemStruct->itemState & ODS_SELECTED) { RECT rOutline = lpDrawItemStruct->rcItem; CBrush FrmBrush((bCtrlFocused) ? m_crFocusLine : m_crNoFocusLine); rOutline.left++; rOutline.right--; dc->FrameRect(&rOutline, &FrmBrush); } if (pOldFont) dc.SelectObject(pOldFont); if (crOldTextColor) dc.SetTextColor(crOldTextColor); #undef LIST_CELL_PADDING }