Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members

CtrlWndTabBar.cpp

Go to the documentation of this file.
00001 //
00002 // CtrlWndTabBar.cpp
00003 //
00004 // Copyright (c) Shareaza Development Team, 2002-2005.
00005 // This file is part of SHAREAZA (www.shareaza.com)
00006 //
00007 // Shareaza is free software; you can redistribute it
00008 // and/or modify it under the terms of the GNU General Public License
00009 // as published by the Free Software Foundation; either version 2 of
00010 // the License, or (at your option) any later version.
00011 //
00012 // Shareaza is distributed in the hope that it will be useful,
00013 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00014 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015 // GNU General Public License for more details.
00016 //
00017 // You should have received a copy of the GNU General Public License
00018 // along with Shareaza; if not, write to the Free Software
00019 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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         //{{AFX_MSG_MAP(CWndTabBar)
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         //}}AFX_MSG_MAP
00053 END_MESSAGE_MAP()
00054 
00055 
00057 // CWndTabBar construction
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 // CWndTabBar operations
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 // CWndTabBar message handlers
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         if ( TabItem* pItem = HitTest( point ) )
00524         {
00525                 CMDIChildWnd* pChild = (CMDIChildWnd*)CWnd::FromHandle( pItem->m_hWnd );
00526                 pChild->PostMessage( WM_SYSCOMMAND, pChild->IsZoomed() ? SC_RESTORE : SC_MAXIMIZE );
00527                 return;
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                 MENUITEMINFO pInfo;
00581                 pInfo.cbSize    = sizeof(pInfo);
00582                 pInfo.fMask             = MIIM_STATE;
00583                 GetMenuItemInfo( pMenu->GetSafeHmenu(), ID_CHILD_RESTORE, FALSE, &pInfo );
00584                 pInfo.fState = ( pInfo.fState & (~MFS_DEFAULT) ) | ( bCanRestore ? MFS_DEFAULT : 0 );
00585                 SetMenuItemInfo( pMenu->GetSafeHmenu(), ID_CHILD_RESTORE, FALSE, &pInfo );
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 // CWndTabBar::TabItem construction
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 // CWndTabBar::TabItem paint
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 }

Generated on Thu Dec 15 10:39:38 2005 for Shareaza 2.2.1.0 by  doxygen 1.4.2