📄 ctrldownloadtabbar.cpp
字号:
else if ( m_bTimer && ! m_pHot )
{
KillTimer( 1 );
m_bTimer = FALSE;
}
CControlBar::OnMouseMove( nFlags, point );
}
void CDownloadTabBar::OnTimer(UINT nIDEvent)
{
if ( nIDEvent == 1 )
{
CRect rcWindow;
CPoint point;
GetClientRect( &rcWindow );
ClientToScreen( &rcWindow );
GetCursorPos( &point );
if ( ! rcWindow.PtInRect( point ) )
{
KillTimer( nIDEvent );
m_pHot = NULL;
m_bTimer = FALSE;
Invalidate();
}
}
CControlBar::OnTimer( nIDEvent );
}
void CDownloadTabBar::OnLButtonDown(UINT nFlags, CPoint point)
{
if ( TabItem* pHit = HitTest( point ) )
{
BOOL bShift = ( nFlags & MK_SHIFT ) != 0;
BOOL bControl = ( nFlags & MK_CONTROL ) != 0;
BOOL bChanged = FALSE;
if ( bControl )
{
bChanged |= pHit->Select( ! pHit->m_bSelected );
}
else if ( bShift )
{
bChanged |= pHit->Select( TRUE );
}
else
{
bChanged |= Select( pHit );
}
if ( bChanged ) NotifySelection();
return;
}
CControlBar::OnLButtonDown( nFlags, point );
}
void CDownloadTabBar::OnLButtonDblClk(UINT nFlags, CPoint point)
{
if ( TabItem* pHit = HitTest( point ) )
{
PostMessage( WM_COMMAND, ID_DOWNLOAD_GROUP_PROPERTIES );
return;
}
OnLButtonDown( nFlags, point );
}
void CDownloadTabBar::OnRButtonUp(UINT nFlags, CPoint point)
{
CRect rcItem;
if ( TabItem* pItem = HitTest( point, &rcItem ) )
{
m_bMenuGray = TRUE;
if ( Select( pItem ) ) NotifySelection();
Invalidate();
ClientToScreen( &rcItem );
CoolMenu.RegisterEdge( rcItem.left, rcItem.bottom - 1, rcItem.Width() );
Skin.TrackPopupMenu( _T("CDownloadTabBar"), CPoint( rcItem.left, rcItem.bottom - 1 ), ID_DOWNLOAD_GROUP_PROPERTIES );
m_bMenuGray = FALSE;
Invalidate();
return;
}
else
{
ClientToScreen( &point );
Skin.TrackPopupMenu( _T("CDownloadTabBar"), point );
return;
}
CControlBar::OnRButtonUp( nFlags, point );
}
void CDownloadTabBar::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
CoolMenu.OnMeasureItem( lpMeasureItemStruct );
}
void CDownloadTabBar::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CoolMenu.OnDrawItem( lpDrawItemStruct );
}
BOOL CDownloadTabBar::Select(TabItem* pHit)
{
BOOL bChanged = FALSE;
for ( POSITION pos = m_pItems.GetHeadPosition() ; pos ; )
{
TabItem* pItem = (TabItem*)m_pItems.GetNext( pos );
bChanged |= pItem->Select( pItem == pHit );
}
return bChanged;
}
int CDownloadTabBar::GetSelectedCount(BOOL bDownloads)
{
int nCount = 0;
for ( POSITION pos = m_pItems.GetHeadPosition() ; pos ; )
{
TabItem* pItem = (TabItem*)m_pItems.GetNext( pos );
if ( pItem->m_bSelected )
{
nCount += bDownloads ? pItem->m_nCount : 1;
}
}
return nCount;
}
CDownloadTabBar::TabItem* CDownloadTabBar::GetSelectedItem()
{
TabItem* pSelected = NULL;
for ( POSITION pos = m_pItems.GetHeadPosition() ; pos ; )
{
TabItem* pItem = (TabItem*)m_pItems.GetNext( pos );
if ( pItem->m_bSelected )
{
if ( pSelected == NULL )
pSelected = pItem;
else
return NULL;
}
}
return pSelected;
}
CDownloadGroup* CDownloadTabBar::GetSelectedGroup()
{
TabItem* pItem = GetSelectedItem();
return pItem ? pItem->m_pGroup : NULL;
}
void CDownloadTabBar::GetSelectedDownloads(CPtrList* pDownloads)
{
CSingleLock pLock( &DownloadGroups.m_pSection, TRUE );
for ( POSITION pos = m_pItems.GetHeadPosition() ; pos ; )
{
TabItem* pItem = (TabItem*)m_pItems.GetNext( pos );
if ( pItem->m_bSelected && DownloadGroups.Check( pItem->m_pGroup ) )
{
pItem->m_pGroup->CopyList( pDownloads );
}
}
}
void CDownloadTabBar::NotifySelection()
{
Invalidate();
GetOwner()->PostMessage( WM_TIMER, 3 );
}
/////////////////////////////////////////////////////////////////////////////
// CDownloadTabBar::TabItem construction
CDownloadTabBar::TabItem::TabItem(CDownloadGroup* pGroup, int nCookie)
{
m_pGroup = pGroup;
m_nImage = 0;
m_bSelected = ( m_pGroup == DownloadGroups.GetSuperGroup() );
Update( nCookie );
}
CDownloadTabBar::TabItem::~TabItem()
{
}
/////////////////////////////////////////////////////////////////////////////
// CDownloadTabBar::TabItem update
BOOL CDownloadTabBar::TabItem::Update(int nCookie)
{
if ( m_bSelected && nCookie ) m_pGroup->SetCookie( nCookie );
BOOL bChanged = FALSE;
if ( m_sName != m_pGroup->m_sName )
{
m_sName = m_pGroup->m_sName;
bChanged = TRUE;
}
BOOL nCount = m_pGroup->GetCount();
if ( m_nCount != nCount )
{
m_nCount = nCount;
bChanged = TRUE;
}
if ( m_nImage != m_pGroup->m_nImage )
{
m_nImage = m_pGroup->m_nImage;
bChanged = TRUE;
}
if ( bChanged )
{
m_sCaption.Format( _T("%s (%i)"), (LPCTSTR)m_sName, m_nCount );
}
return bChanged;
}
/////////////////////////////////////////////////////////////////////////////
// CDownloadTabBar::TabItem select
BOOL CDownloadTabBar::TabItem::Select(BOOL bSelect)
{
if ( bSelect == m_bSelected ) return FALSE;
m_bSelected = bSelect;
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CDownloadTabBar::TabItem paint
void CDownloadTabBar::TabItem::Paint(CDownloadTabBar* pBar, CDC* pDC, CRect* pRect, BOOL bHot, BOOL bTransparent)
{
CRect rc( pRect );
COLORREF crBack;
BOOL bPopulated = m_nCount > 0;
if ( m_bSelected && pBar->m_bMenuGray )
{
crBack = CoolInterface.m_crBackNormal;
pDC->Draw3dRect( &rc, CoolInterface.m_crDisabled, CoolInterface.m_crDisabled );
}
else if ( bHot || m_bSelected )
{
crBack = ( bHot && m_bSelected ) ? CoolInterface.m_crBackCheckSel : CoolInterface.m_crBackSel;
pDC->Draw3dRect( &rc, CoolInterface.m_crBorder, CoolInterface.m_crBorder );
}
else
{
crBack = bTransparent ? CLR_NONE : CoolInterface.m_crMidtone;
if ( crBack != CLR_NONE ) pDC->Draw3dRect( &rc, crBack, crBack );
}
rc.DeflateRect( 1, 1 );
if ( crBack != CLR_NONE ) pDC->SetBkColor( crBack );
CPoint ptImage( rc.left + 2, rc.top + 1 );
if ( m_bSelected )
{
ImageList_DrawEx( ShellIcons.GetHandle( 16 ), m_nImage, pDC->GetSafeHdc(),
ptImage.x, ptImage.y, 0, 0, crBack, CLR_NONE, ILD_NORMAL );
pDC->ExcludeClipRect( ptImage.x, ptImage.y, ptImage.x + 16, ptImage.y + 16 );
}
else if ( bHot )
{
ptImage.Offset( -1, -1 );
if ( crBack != CLR_NONE )
{
pDC->FillSolidRect( ptImage.x, ptImage.y, 18, 2, crBack );
pDC->FillSolidRect( ptImage.x, ptImage.y + 2, 2, 16, crBack );
}
ptImage.Offset( 2, 2 );
pDC->SetTextColor( CoolInterface.m_crShadow );
ImageList_DrawEx( ShellIcons.GetHandle( 16 ), m_nImage, pDC->GetSafeHdc(),
ptImage.x, ptImage.y, 0, 0, crBack, CLR_NONE, ILD_MASK );
ptImage.Offset( -2, -2 );
ImageList_DrawEx( ShellIcons.GetHandle( 16 ), m_nImage, pDC->GetSafeHdc(),
ptImage.x, ptImage.y, 0, 0, CLR_NONE, CLR_NONE, ILD_NORMAL );
pDC->ExcludeClipRect( ptImage.x, ptImage.y, ptImage.x + 18, ptImage.y + 18 );
ptImage.Offset( 1, 1 );
}
else
{
ImageList_DrawEx( ShellIcons.GetHandle( 16 ), m_nImage, pDC->GetSafeHdc(),
ptImage.x, ptImage.y, 0, 0, crBack, CoolInterface.m_crShadow, ILD_BLEND50 );
pDC->ExcludeClipRect( ptImage.x, ptImage.y, ptImage.x + 16, ptImage.y + 16 );
}
rc.left += 20;
CString strText = m_sCaption;
if ( pDC->GetTextExtent( strText ).cx > rc.Width() )
{
while ( pDC->GetTextExtent( strText + _T("
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -