00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "StdAfx.h"
00023 #include "Shareaza.h"
00024 #include "Settings.h"
00025 #include "CtrlWndTabBar.h"
00026 #include "CoolInterface.h"
00027 #include "CoolMenu.h"
00028 #include "Skin.h"
00029
00030 #include "WndMain.h"
00031 #include "WndPlugin.h"
00032
00033 #ifdef _DEBUG
00034 #define new DEBUG_NEW
00035 #undef THIS_FILE
00036 static char THIS_FILE[] = __FILE__;
00037 #endif
00038
00039 BEGIN_MESSAGE_MAP(CWndTabBar, CControlBar)
00040
00041 ON_WM_LBUTTONDOWN()
00042 ON_WM_RBUTTONUP()
00043 ON_WM_LBUTTONDBLCLK()
00044 ON_WM_MOUSEMOVE()
00045 ON_WM_TIMER()
00046 ON_WM_CREATE()
00047 ON_WM_MEASUREITEM()
00048 ON_WM_DRAWITEM()
00049 ON_WM_MBUTTONUP()
00050 ON_WM_LBUTTONUP()
00051 ON_WM_SETCURSOR()
00052
00053 END_MESSAGE_MAP()
00054
00055
00057
00058
00059 CWndTabBar::CWndTabBar()
00060 {
00061 m_nMaximumWidth = 140;
00062 m_nCookie = 0;
00063 m_bTimer = FALSE;
00064 m_bMenuGray = FALSE;
00065 m_nMessage = 0;
00066 }
00067
00068 CWndTabBar::~CWndTabBar()
00069 {
00070 for ( POSITION pos = m_pItems.GetHeadPosition() ; pos ; )
00071 {
00072 delete (TabItem*)m_pItems.GetNext( pos );
00073 }
00074 m_pItems.RemoveAll();
00075 }
00076
00078
00079
00080 BOOL CWndTabBar::Create(CWnd* pParentWnd, DWORD dwStyle, UINT nID)
00081 {
00082 CRect rc;
00083 dwStyle |= WS_CHILD;
00084 return CWnd::Create( NULL, NULL, dwStyle, rc, pParentWnd, nID, NULL );
00085 }
00086
00087 void CWndTabBar::SetMessage(UINT nMessageID)
00088 {
00089 if ( m_nMessage == nMessageID ) return;
00090
00091 if ( m_nMessage = nMessageID )
00092 Skin.LoadString( m_sMessage, m_nMessage );
00093 else
00094 m_sMessage.Empty();
00095
00096 if ( m_pItems.IsEmpty() ) Invalidate();
00097 }
00098
00099 void CWndTabBar::SetMessage(LPCTSTR pszText)
00100 {
00101 if ( m_sMessage == pszText ) return;
00102 m_nMessage = 0;
00103 m_sMessage = pszText;
00104 if ( m_pItems.IsEmpty() ) Invalidate();
00105 }
00106
00107 void CWndTabBar::SetMaximumWidth(int nWidth)
00108 {
00109 if ( m_nMaximumWidth == nWidth ) return;
00110 m_nMaximumWidth = nWidth;
00111 Invalidate();
00112 }
00113
00114 void CWndTabBar::SetWatermark(HBITMAP hBitmap)
00115 {
00116 if ( m_bmImage.m_hObject ) m_bmImage.DeleteObject();
00117 if ( hBitmap ) m_bmImage.Attach( hBitmap );
00118
00119 for ( POSITION pos = m_pItems.GetHeadPosition() ; pos ; )
00120 {
00121 TabItem* pItem = (TabItem*)m_pItems.GetNext( pos );
00122 pItem->m_nImage = -1;
00123 }
00124
00125 m_pIcons.RemoveAll();
00126 m_pImages.DeleteImageList();
00127 m_pImages.Create( 16, 16, ILC_COLOR32|ILC_MASK, 1, 1 );
00128 }
00129
00131
00132
00133 int CWndTabBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
00134 {
00135 if ( CControlBar::OnCreate( lpCreateStruct ) == -1 ) return -1;
00136
00137 m_pImages.Create( 16, 16, ILC_COLOR32|ILC_MASK, 1, 1 );
00138
00139 m_mnuChild.LoadMenu( IDR_CHILDFRAME );
00140 CoolMenu.AddMenu( &m_mnuChild );
00141
00142 m_dwStyle |= CBRS_BORDER_3D;
00143
00144 return 0;
00145 }
00146
00147 CSize CWndTabBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
00148 {
00149 CSize size( 32767, 26 );
00150
00151 if ( CWnd* pParent = AfxGetMainWnd() )
00152 {
00153 CRect rc;
00154 pParent->GetWindowRect( &rc );
00155 if ( rc.Width() > 32 ) size.cx = rc.Width() + 2;
00156 }
00157
00158 return size;
00159 }
00160
00161 void CWndTabBar::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler)
00162 {
00163 if ( ! IsWindow( m_hWnd ) ) return;
00164 if ( ! pTarget->IsKindOf( RUNTIME_CLASS(CMainWnd) ) ) return;
00165
00166 CMainWnd* pMainWnd = (CMainWnd*)pTarget;
00167 CWindowManager* pManager = &pMainWnd->m_pWindows;
00168
00169 BOOL bChanged = FALSE;
00170 m_nCookie++;
00171
00172 CChildWnd* pActive = pManager->GetActive();
00173
00174 if ( pActive && pActive->m_bGroupMode )
00175 {
00176 if ( pActive->m_pGroupParent ) pActive = pActive->m_pGroupParent;
00177 }
00178
00179 for ( POSITION posChild = pManager->GetIterator() ; posChild ; )
00180 {
00181 CChildWnd* pChild = pManager->GetNext( posChild );
00182
00183 BOOL bFound = FALSE;
00184 CString strCaption;
00185
00186 if ( pChild->m_bTabMode ) continue;
00187
00188 pChild->GetWindowText( strCaption );
00189
00190 if ( pChild->m_bPanelMode )
00191 {
00192 if ( strCaption.Find( _T("Search : ") ) == 0 ) strCaption = strCaption.Mid( 9 );
00193 if ( strCaption.Find( _T("Browse Host : ") ) == 0 ) strCaption = strCaption.Mid( 14 );
00194 }
00195
00196 for ( POSITION pos = m_pItems.GetHeadPosition() ; pos ; )
00197 {
00198 TabItem* pItem = (TabItem*)m_pItems.GetNext( pos );
00199
00200 if ( pItem->m_hWnd == pChild->GetSafeHwnd() )
00201 {
00202 bFound = TRUE;
00203 pItem->m_nCookie = m_nCookie;
00204
00205 if ( strCaption != pItem->m_sCaption )
00206 {
00207 pItem->m_nImage = ImageIndexForWindow( pChild );
00208 pItem->m_sCaption = strCaption;
00209 bChanged = TRUE;
00210 }
00211 else if ( pItem->m_nImage < 0 )
00212 {
00213 pItem->m_nImage = ImageIndexForWindow( pChild );
00214 bChanged = TRUE;
00215 }
00216
00217 if ( pChild->IsWindowVisible() != pItem->m_bVisible )
00218 {
00219 pItem->m_bVisible = pChild->IsWindowVisible();
00220 bChanged = TRUE;
00221 }
00222
00223 if ( pChild->m_bAlert != pItem->m_bAlert )
00224 {
00225 pItem->m_bAlert = pChild->m_bAlert;
00226 bChanged = TRUE;
00227 }
00228
00229 if ( pChild == pActive && m_pSelected != pItem )
00230 {
00231 m_pSelected = pItem;
00232 bChanged = TRUE;
00233 }
00234 else if ( m_pSelected == pItem && pChild != pActive )
00235 {
00236 m_pSelected = NULL;
00237 bChanged = TRUE;
00238 }
00239
00240 break;
00241 }
00242 }
00243
00244 if ( bFound ) continue;
00245
00246 TabItem* pItem = new TabItem( pChild, m_nCookie, strCaption );
00247 if ( pActive == pChild ) m_pSelected = pItem;
00248 pItem->m_nImage = ImageIndexForWindow( pChild );
00249 m_pItems.AddTail( pItem );
00250 bChanged = TRUE;
00251 }
00252
00253 for ( POSITION pos = m_pItems.GetHeadPosition() ; pos ; )
00254 {
00255 POSITION posOld = pos;
00256 TabItem* pItem = (TabItem*)m_pItems.GetNext( pos );
00257
00258 if ( pItem->m_nCookie != m_nCookie )
00259 {
00260 if ( m_pSelected == pItem ) m_pSelected = NULL;
00261 delete pItem;
00262 m_pItems.RemoveAt( posOld );
00263 bChanged = TRUE;
00264 }
00265 }
00266
00267 if ( bChanged ) Invalidate();
00268 }
00269
00270 int CWndTabBar::ImageIndexForWindow(CWnd* pChild)
00271 {
00272 CRuntimeClass* pClass = pChild->GetRuntimeClass();
00273 WORD nImage;
00274
00275 if ( pClass != RUNTIME_CLASS(CPluginWnd) )
00276 {
00277 if ( m_pIcons.Lookup( pClass, nImage ) ) return (int)nImage;
00278 nImage = m_pImages.Add( pChild->GetIcon( FALSE ) );
00279 m_pIcons.SetAt( pClass, nImage );
00280 }
00281 else
00282 {
00283 HICON hIcon = pChild->GetIcon( FALSE );
00284 if ( m_pIcons.Lookup( (LPVOID)hIcon, nImage ) ) return (int)nImage;
00285 nImage = m_pImages.Add( hIcon );
00286 m_pIcons.SetAt( (LPVOID)hIcon, nImage );
00287 }
00288
00289 return (int)nImage;
00290 }
00291
00292 CWndTabBar::TabItem* CWndTabBar::HitTest(const CPoint& point, CRect* pItemRect) const
00293 {
00294 if ( m_pItems.IsEmpty() ) return NULL;
00295
00296 CRect rc;
00297 GetClientRect( &rc );
00298 CalcInsideRect( rc, FALSE );
00299
00300 rc.left -= m_cyTopBorder;
00301 rc.top -= m_cxLeftBorder;
00302 rc.right += m_cyBottomBorder;
00303 rc.bottom += m_cxRightBorder;
00304
00305 CRect rcItem( rc.left + 3, rc.top + 1, 0, rc.bottom - 1 );
00306 rcItem.right = ( rc.Width() - 3 * m_pItems.GetCount() ) / m_pItems.GetCount() + 3;
00307 rcItem.right = min( rcItem.right, LONG(m_nMaximumWidth) );
00308
00309 for ( POSITION pos = m_pItems.GetHeadPosition() ; pos ; )
00310 {
00311 TabItem* pItem = (TabItem*)m_pItems.GetNext( pos );
00312 if ( rcItem.PtInRect( point ) )
00313 {
00314 if ( pItemRect ) *pItemRect = rcItem;
00315 return pItem;
00316 }
00317 rcItem.OffsetRect( rcItem.Width() + 3, 0 );
00318 }
00319
00320 return NULL;
00321 }
00322
00323 int CWndTabBar::OnToolHitTest(CPoint point, TOOLINFO* pTI) const
00324 {
00325 CRect rcItem;
00326 TabItem* pItem = HitTest( point, &rcItem );
00327
00328 if ( pItem == NULL ) return -1;
00329 if ( ! pTI ) return 1;
00330
00331 pTI->uFlags = 0;
00332 pTI->hwnd = GetSafeHwnd();
00333 pTI->uId = (UINT)pItem->m_hWnd;
00334 pTI->rect = rcItem;
00335 pTI->lpszText = _tcsdup( pItem->m_sCaption );
00336
00337 return pTI->uId;
00338 }
00339
00340 void CWndTabBar::DoPaint(CDC* pDC)
00341 {
00342 ASSERT_VALID(this);
00343 ASSERT_VALID(pDC);
00344
00345 CDC* pOutDC = pDC;
00346 CRect rc;
00347
00348 GetClientRect( &rc );
00349
00350 if ( m_bmImage.m_hObject != NULL )
00351 {
00352 pDC = CoolInterface.GetBuffer( *pDC, rc.Size() );
00353 CoolInterface.DrawWatermark( pDC, &rc, &m_bmImage );
00354 }
00355
00356 DrawBorders( pDC, rc );
00357
00358 CFont* pOldFont = (CFont*)pDC->SelectObject( &CoolInterface.m_fntNormal );
00359
00360 if ( m_pItems.GetCount() )
00361 {
00362 m_nCloseImage = CoolInterface.ImageForID( ID_CHILD_CLOSE );
00363
00364 CRect rcItem( rc.left + 3, rc.top + 1, 0, rc.bottom - 1 );
00365 rcItem.right = ( rc.Width() - 3 * m_pItems.GetCount() ) / m_pItems.GetCount() + 3;
00366 rcItem.right = min( rcItem.right, LONG(m_nMaximumWidth) );
00367
00368 for ( POSITION pos = m_pItems.GetHeadPosition() ; pos ; )
00369 {
00370 TabItem* pItem = (TabItem*)m_pItems.GetNext( pos );
00371
00372 pItem->Paint( this, pDC, &rcItem, m_pSelected == pItem, m_pHot == pItem,
00373 pDC != pOutDC );
00374 pDC->ExcludeClipRect( &rcItem );
00375
00376 rcItem.OffsetRect( rcItem.Width() + 3, 0 );
00377 }
00378
00379 if ( pDC == pOutDC ) pDC->FillSolidRect( &rc, CoolInterface.m_crMidtone );
00380 }
00381 else
00382 {
00383 CSize sz = pDC->GetTextExtent( m_sMessage );
00384 CPoint pt = rc.CenterPoint();
00385 pt.x -= sz.cx / 2; pt.y -= sz.cy / 2 + 1;
00386
00387 pDC->SetBkColor( CoolInterface.m_crMidtone );
00388 pDC->SetTextColor( CoolInterface.m_crDisabled );
00389
00390 if ( pDC == pOutDC )
00391 {
00392 pDC->SetBkMode( OPAQUE );
00393 pDC->ExtTextOut( pt.x, pt.y, ETO_CLIPPED|ETO_OPAQUE, &rc, m_sMessage, NULL );
00394 }
00395 else
00396 {
00397 pDC->SetBkMode( TRANSPARENT );
00398 pDC->ExtTextOut( pt.x, pt.y, ETO_CLIPPED, &rc, m_sMessage, NULL );
00399 }
00400
00401 m_rcMessage.SetRect( pt.x, pt.y, pt.x + sz.cx, pt.y + sz.cy );
00402 }
00403
00404 pDC->SelectObject( pOldFont );
00405
00406 if ( pDC != pOutDC )
00407 {
00408 GetClientRect( &rc );
00409 pOutDC->BitBlt( 0, 0, rc.Width(), rc.Height(), pDC, 0, 0, SRCCOPY );
00410 pDC->SelectClipRgn( NULL );
00411 }
00412 }
00413
00414 void CWndTabBar::OnMouseMove(UINT nFlags, CPoint point)
00415 {
00416 TabItem* pItem = HitTest( point );
00417
00418 if ( pItem != m_pHot )
00419 {
00420 m_pHot = pItem;
00421 Invalidate();
00422 }
00423
00424 if ( ! m_bTimer && m_pHot )
00425 {
00426 SetTimer( 1, 100, NULL );
00427 m_bTimer = TRUE;
00428 }
00429 else if ( m_bTimer && ! m_pHot )
00430 {
00431 KillTimer( 1 );
00432 m_bTimer = FALSE;
00433 }
00434
00435 CControlBar::OnMouseMove( nFlags, point );
00436 }
00437
00438 void CWndTabBar::OnTimer(UINT nIDEvent)
00439 {
00440 if ( nIDEvent == 1 )
00441 {
00442 CRect rcWindow;
00443 CPoint point;
00444
00445 GetClientRect( &rcWindow );
00446 ClientToScreen( &rcWindow );
00447 GetCursorPos( &point );
00448
00449 if ( ! rcWindow.PtInRect( point ) )
00450 {
00451 KillTimer( nIDEvent );
00452 m_pHot = NULL;
00453 m_bTimer = FALSE;
00454 Invalidate();
00455 }
00456 }
00457
00458 CControlBar::OnTimer( nIDEvent );
00459 }
00460
00461 BOOL CWndTabBar::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
00462 {
00463 if ( m_pItems.GetCount() == 0 && m_nMessage == IDS_TABBAR_CONNECTED )
00464 {
00465 CPoint point;
00466 GetCursorPos( &point );
00467 ScreenToClient( &point );
00468
00469 if ( m_rcMessage.PtInRect( point ) )
00470 {
00471 SetCursor( theApp.LoadCursor( IDC_HAND ) );
00472 return TRUE;
00473 }
00474 }
00475
00476 return CControlBar::OnSetCursor( pWnd, nHitTest, message );
00477 }
00478
00479 void CWndTabBar::OnLButtonDown(UINT nFlags, CPoint point)
00480 {
00481 CRect rc;
00482
00483 if ( TabItem* pItem = HitTest( point, &rc ) )
00484 {
00485 CChildWnd* pChild = (CChildWnd*)CWnd::FromHandle( pItem->m_hWnd );
00486
00487 if ( m_pSelected == pItem &&
00488 Settings.General.GUIMode != GUI_WINDOWED &&
00489 point.x >= rc.right - 18 )
00490 {
00491 pChild->PostMessage( WM_SYSCOMMAND, SC_CLOSE, 0 );
00492 return;
00493 }
00494 else if ( pChild->IsIconic() )
00495 {
00496 pChild->ShowWindow( SW_SHOWNORMAL );
00497 }
00498 else if ( m_pSelected == pItem && ! pChild->m_bPanelMode )
00499 {
00500 pChild->ShowWindow( SW_HIDE );
00501 pChild->ShowWindow( SW_MINIMIZE );
00502 return;
00503 }
00504
00505 pChild->MDIActivate();
00506
00507 return;
00508 }
00509 else if ( m_nMessage == IDS_TABBAR_CONNECTED )
00510 {
00511 if ( m_pItems.GetCount() == 0 && m_rcMessage.PtInRect( point ) )
00512 {
00513 return;
00514 }
00515 }
00516
00517 CControlBar::OnLButtonDown( nFlags, point );
00518 }
00519
00520 void CWndTabBar::OnLButtonDblClk(UINT nFlags, CPoint point)
00521 {
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531 OnLButtonDown( nFlags, point );
00532 }
00533
00534 void CWndTabBar::OnLButtonUp(UINT nFlags, CPoint point)
00535 {
00536 CRect rc;
00537
00538 if ( TabItem* pItem = HitTest( point, &rc ) )
00539 {
00540 }
00541 else if ( m_nMessage == IDS_TABBAR_CONNECTED )
00542 {
00543 if ( m_pItems.GetCount() == 0 && m_rcMessage.PtInRect( point ) )
00544 {
00545 GetOwner()->PostMessage( WM_COMMAND, ID_NETWORK_SEARCH );
00546 }
00547 }
00548
00549 CControlBar::OnLButtonUp( nFlags, point );
00550 }
00551
00552 void CWndTabBar::OnMButtonUp(UINT nFlags, CPoint point)
00553 {
00554 if ( TabItem* pItem = HitTest( point ) )
00555 {
00556 CChildWnd* pChild = (CChildWnd*)CWnd::FromHandle( pItem->m_hWnd );
00557 pChild->PostMessage( WM_SYSCOMMAND, SC_CLOSE, 0 );
00558 }
00559
00560 CControlBar::OnMButtonUp( nFlags, point );
00561 }
00562
00563 void CWndTabBar::OnRButtonUp(UINT nFlags, CPoint point)
00564 {
00565 CRect rcItem;
00566
00567 if ( TabItem* pItem = HitTest( point, &rcItem ) )
00568 {
00569 CChildWnd* pChild = (CChildWnd*)CWnd::FromHandle( pItem->m_hWnd );
00570 if ( pChild->IsWindowVisible() ) pChild->MDIActivate();
00571
00572 ClientToScreen( &rcItem );
00573
00574 CMenu* pMenu = m_mnuChild.GetSubMenu( pChild->m_bPanelMode ? 1 : 0 );
00575
00576 BOOL bCanRestore = pChild->IsIconic() || pChild->IsZoomed();
00577 UINT nCommand = 0;
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588 pMenu->EnableMenuItem( ID_CHILD_RESTORE, MF_BYCOMMAND |
00589 ( bCanRestore ? 0 : MF_GRAYED ) );
00590 pMenu->EnableMenuItem( ID_CHILD_MINIMISE, MF_BYCOMMAND |
00591 ( pChild->IsIconic() ? MF_GRAYED : 0 ) );
00592 pMenu->EnableMenuItem( ID_CHILD_MAXIMISE, MF_BYCOMMAND |
00593 ( pChild->IsZoomed() ? MF_GRAYED : 0 ) );
00594
00595 m_bMenuGray = TRUE;
00596 Invalidate();
00597
00598 if ( rcItem.bottom > GetSystemMetrics( SM_CYSCREEN ) / 2 )
00599 {
00600 nCommand = pMenu->TrackPopupMenu( TPM_RETURNCMD|TPM_RIGHTBUTTON|
00601 TPM_LEFTALIGN|TPM_BOTTOMALIGN, theApp.m_bRTL ? rcItem.right : rcItem.left,
00602 rcItem.top + 1, this, NULL );
00603 }
00604 else
00605 {
00606 CoolMenu.RegisterEdge( theApp.m_bRTL ? rcItem.right : rcItem.left,
00607 rcItem.bottom - 1, rcItem.Width() );
00608 nCommand = pMenu->TrackPopupMenu( TPM_RETURNCMD|TPM_RIGHTBUTTON|
00609 TPM_LEFTALIGN|TPM_TOPALIGN, theApp.m_bRTL ? rcItem.right : rcItem.left,
00610 rcItem.bottom - 1, this, NULL );
00611 }
00612
00613 m_bMenuGray = FALSE;
00614 Invalidate();
00615
00616 switch ( nCommand )
00617 {
00618 case ID_CHILD_RESTORE:
00619 pChild->PostMessage( WM_SYSCOMMAND, SC_RESTORE, 0 );
00620 break;
00621 case ID_CHILD_MINIMISE:
00622 pChild->PostMessage( WM_SYSCOMMAND, SC_MINIMIZE, 0 );
00623 break;
00624 case ID_CHILD_MAXIMISE:
00625 pChild->PostMessage( WM_SYSCOMMAND, SC_MAXIMIZE, 0 );
00626 break;
00627 case ID_CHILD_CLOSE:
00628 pChild->PostMessage( WM_SYSCOMMAND, SC_CLOSE, 0 );
00629 break;
00630 }
00631
00632 return;
00633 }
00634
00635 CControlBar::OnRButtonUp( nFlags, point );
00636 }
00637
00638 void CWndTabBar::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
00639 {
00640 CoolMenu.OnMeasureItem( lpMeasureItemStruct );
00641 }
00642
00643 void CWndTabBar::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
00644 {
00645 CoolMenu.OnDrawItem( lpDrawItemStruct );
00646 }
00647
00648
00650
00651
00652 CWndTabBar::TabItem::TabItem(CChildWnd* pWnd, DWORD nCookie, LPCTSTR pszCaption)
00653 {
00654 m_hWnd = pWnd->GetSafeHwnd();
00655 m_pClass = pWnd->GetRuntimeClass();
00656 m_nImage = -1;
00657 m_bVisible = pWnd->IsWindowVisible();
00658 m_bAlert = pWnd->m_bAlert;
00659 m_nCookie = nCookie;
00660
00661 if ( pszCaption != NULL )
00662 m_sCaption = pszCaption;
00663 else
00664 pWnd->GetWindowText( m_sCaption );
00665 }
00666
00667 CWndTabBar::TabItem::~TabItem()
00668 {
00669 }
00670
00672
00673
00674 void CWndTabBar::TabItem::Paint(CWndTabBar* pBar, CDC* pDC, CRect* pRect, BOOL bSelected, BOOL bHot, BOOL bTransparent)
00675 {
00676 CRect rc( pRect );
00677 COLORREF crBack;
00678
00679 if ( bSelected && pBar->m_bMenuGray )
00680 {
00681 crBack = CoolInterface.m_crBackNormal;
00682 pDC->Draw3dRect( &rc, CoolInterface.m_crDisabled, CoolInterface.m_crDisabled );
00683 }
00684 else if ( bHot || ( bSelected && m_bVisible ) )
00685 {
00686 crBack = ( bHot && bSelected ) ? CoolInterface.m_crBackCheckSel : CoolInterface.m_crBackSel;
00687 pDC->Draw3dRect( &rc, CoolInterface.m_crBorder, CoolInterface.m_crBorder );
00688 }
00689 else
00690 {
00691 crBack = bTransparent ? CLR_NONE : CoolInterface.m_crMidtone;
00692 if ( crBack != CLR_NONE ) pDC->Draw3dRect( &rc, crBack, crBack );
00693 }
00694
00695 rc.DeflateRect( 1, 1 );
00696 if ( crBack != CLR_NONE ) pDC->SetBkColor( crBack );
00697
00698 CPoint ptImage( rc.left + 2, rc.top + 1 );
00699
00700 if ( bSelected )
00701 {
00702 ImageList_DrawEx( pBar->m_pImages.GetSafeHandle(), m_nImage, pDC->GetSafeHdc(),
00703 ptImage.x, ptImage.y, 0, 0, crBack, CLR_NONE, ILD_NORMAL );
00704 pDC->ExcludeClipRect( ptImage.x, ptImage.y, ptImage.x + 16, ptImage.y + 16 );
00705 }
00706 else if ( bHot )
00707 {
00708 ptImage.Offset( -1, -1 );
00709
00710 if ( crBack != CLR_NONE )
00711 {
00712 pDC->FillSolidRect( ptImage.x, ptImage.y, 18, 2, crBack );
00713 pDC->FillSolidRect( ptImage.x, ptImage.y + 2, 2, 16, crBack );
00714 }
00715
00716 ptImage.Offset( 2, 2 );
00717 pDC->SetTextColor( CoolInterface.m_crShadow );
00718 ImageList_DrawEx( pBar->m_pImages.GetSafeHandle(), m_nImage, pDC->GetSafeHdc(),
00719 ptImage.x, ptImage.y, 0, 0, crBack, CLR_NONE, ILD_MASK );
00720
00721 ptImage.Offset( -2, -2 );
00722 ImageList_DrawEx( pBar->m_pImages.GetSafeHandle(), m_nImage, pDC->GetSafeHdc(),
00723 ptImage.x, ptImage.y, 0, 0, CLR_NONE, CLR_NONE, ILD_NORMAL );
00724
00725 pDC->ExcludeClipRect( ptImage.x, ptImage.y, ptImage.x + 18, ptImage.y + 18 );
00726
00727 ptImage.Offset( 1, 1 );
00728 }
00729 else
00730 {
00731 ImageList_DrawEx( pBar->m_pImages.GetSafeHandle(), m_nImage, pDC->GetSafeHdc(),
00732 ptImage.x, ptImage.y, 0, 0, crBack, CoolInterface.m_crShadow, ILD_BLEND50 );
00733 pDC->ExcludeClipRect( ptImage.x, ptImage.y, ptImage.x + 16, ptImage.y + 16 );
00734 }
00735
00736 rc.left += 20;
00737
00738 if ( bSelected && Settings.General.GUIMode != GUI_WINDOWED )
00739 {
00740 ptImage.x = rc.right - 18;
00741 ImageList_DrawEx( CoolInterface.m_pImages, pBar->m_nCloseImage,
00742 pDC->GetSafeHdc(), ptImage.x, ptImage.y, 0, 0, crBack, CoolInterface.m_crShadow,
00743 ILD_BLEND50 );
00744 pDC->ExcludeClipRect( ptImage.x, ptImage.y, ptImage.x + 16, ptImage.y + 16 );
00745 rc.right -= 20;
00746 if ( crBack != CLR_NONE ) pDC->FillSolidRect( rc.right, rc.top, 20, rc.Height(), crBack );
00747 }
00748
00749 CString strText = m_sCaption;
00750
00751 if ( pDC->GetTextExtent( strText ).cx > rc.Width() )
00752 {
00753 while ( pDC->GetTextExtent( strText + _T('\x2026') ).cx > rc.Width() && strText.GetLength() )
00754 {
00755 strText = strText.Left( strText.GetLength() - 1 );
00756 }
00757
00758 if ( strText.GetLength() ) strText += _T('\x2026');
00759 }
00760
00761 rc.left -= 20;
00762
00763 if ( crBack != CLR_NONE ) pDC->SetBkColor( crBack );
00764
00765 if ( m_bAlert )
00766 {
00767 pDC->SetTextColor( RGB( 255, 0, 0 ) );
00768 }
00769 else if ( ! m_bVisible && ! bHot )
00770 {
00771 pDC->SetTextColor( CoolInterface.m_crDisabled );
00772 }
00773 else if ( bSelected || bHot )
00774 {
00775 pDC->SetTextColor( CoolInterface.m_crCmdTextSel );
00776 }
00777 else
00778 {
00779 pDC->SetTextColor( CoolInterface.m_crCmdText );
00780 }
00781
00782 if ( crBack != CLR_NONE )
00783 {
00784 pDC->SetBkMode( OPAQUE );
00785 pDC->ExtTextOut( rc.left + 20, rc.top + 2, ETO_CLIPPED|ETO_OPAQUE, &rc, strText, NULL );
00786 }
00787 else
00788 {
00789 pDC->SetBkMode( TRANSPARENT );
00790 pDC->ExtTextOut( rc.left + 20, rc.top + 2, ETO_CLIPPED, &rc, strText, NULL );
00791 }
00792 }