📄 ctrlsharedfolder.cpp
字号:
//
// CtrlSharedFolder.cpp
//
// Copyright (c) Shareaza Development Team, 2002-2004.
// This file is part of SHAREAZA (www.shareaza.com)
//
// Shareaza is free software; you can redistribute it
// and/or modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// Shareaza is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Shareaza; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
#include "StdAfx.h"
#include "Shareaza.h"
#include "Settings.h"
#include "Library.h"
#include "LibraryFolders.h"
#include "SharedFolder.h"
#include "ShellIcons.h"
#include "CtrlSharedFolder.h"
#include "Skin.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
BEGIN_MESSAGE_MAP(CLibraryFolderCtrl, CTreeCtrl)
//{{AFX_MSG_MAP(CLibraryFolderCtrl)
ON_WM_LBUTTONDOWN()
ON_WM_KEYDOWN()
ON_WM_CREATE()
ON_WM_LBUTTONDBLCLK()
ON_WM_LBUTTONUP()
ON_NOTIFY_REFLECT(TVN_ITEMEXPANDEDW, OnItemExpanded)
ON_NOTIFY_REFLECT(TVN_ITEMEXPANDEDA, OnItemExpanded)
ON_NOTIFY_REFLECT(TVN_SELCHANGEDW, OnSelChanged)
ON_NOTIFY_REFLECT(TVN_SELCHANGEDA, OnSelChanged)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
ON_WM_RBUTTONDOWN()
ON_WM_NCPAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLibraryFolderCtrl construction
CLibraryFolderCtrl::CLibraryFolderCtrl()
{
m_bFirstClick = TRUE;
m_bMultiSelect = TRUE;
m_bSaveExpand = FALSE;
}
CLibraryFolderCtrl::~CLibraryFolderCtrl()
{
}
/////////////////////////////////////////////////////////////////////////////
// CLibraryFolderCtrl operations
BOOL CLibraryFolderCtrl::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
{
dwStyle |= WS_CHILD|/*TVS_PRIVATEIMAGELISTS|*/TVS_HASLINES|TVS_LINESATROOT;
dwStyle |= TVS_HASBUTTONS|TVS_SHOWSELALWAYS;
return CTreeCtrl::Create( dwStyle, rect, pParentWnd, nID );
}
void CLibraryFolderCtrl::SetMultiSelect(BOOL bMultiSelect)
{
m_bMultiSelect = bMultiSelect;
}
void CLibraryFolderCtrl::SetSaveExpand(BOOL bSaveExpand)
{
m_bSaveExpand = bSaveExpand;
}
void CLibraryFolderCtrl::Update(DWORD nUpdateCookie)
{
CPtrList pAlready;
for ( HTREEITEM hItem = GetChildItem( m_hRoot ) ; hItem ; )
{
HTREEITEM hNext = GetNextSiblingItem( hItem );
CLibraryFolder* pFolder = (CLibraryFolder*)GetItemData( hItem );
if ( LibraryFolders.CheckFolder( pFolder ) )
{
Update( pFolder, hItem, NULL, nUpdateCookie, FALSE );
pAlready.AddTail( pFolder );
}
else
{
DeleteItem( hItem );
}
hItem = hNext;
}
for ( POSITION pos = LibraryFolders.GetFolderIterator() ; pos ; )
{
CLibraryFolder* pFolder = LibraryFolders.GetNextFolder( pos );
if ( pAlready.Find( pFolder ) == NULL )
{
Update( pFolder, NULL, m_hRoot, nUpdateCookie, FALSE );
}
}
}
void CLibraryFolderCtrl::Update(CLibraryFolder* pFolder, HTREEITEM hFolder, HTREEITEM hParent, DWORD nUpdateCookie, BOOL bRecurse)
{
if ( ! hFolder )
{
DWORD dwStyle = INDEXTOOVERLAYMASK( pFolder->IsShared() ? 0 : SHI_O_LOCKED );
if ( pFolder->m_sPath.CompareNoCase( Settings.Downloads.CompletePath ) == 0 ) dwStyle |= TVIS_BOLD;
if ( m_bMultiSelect && GetFirstSelectedItem() == NULL ) dwStyle |= TVIS_SELECTED;
if ( pFolder->m_bExpanded ) dwStyle |= TVIS_EXPANDED;
CString strName = pFolder->m_sName;
if ( pFolder->m_pParent == NULL )
{
CString strDrive;
if ( pFolder->m_sPath.Find( _T(":\\") ) == 1 || pFolder->m_sPath.GetLength() == 2 )
strDrive.Format( _T(" (%c:)"), pFolder->m_sPath[0] );
else
strDrive = _T(" (Net)");
strName += strDrive;
dwStyle |= TVIS_EXPANDED;
}
hFolder = InsertItem( TVIF_PARAM|TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_STATE,
strName, SHI_FOLDER_CLOSED, SHI_FOLDER_CLOSED, dwStyle,
TVIS_EXPANDED|TVIS_SELECTED|TVIS_OVERLAYMASK, (LPARAM)pFolder, hParent, TVI_SORT );
}
else
{
DWORD dwMask = TVIS_OVERLAYMASK | TVIS_BOLD;
DWORD dwStyle = INDEXTOOVERLAYMASK( pFolder->IsShared() ? 0 : SHI_O_LOCKED );
if ( pFolder->m_sPath.CompareNoCase( Settings.Downloads.CompletePath ) == 0 ) dwStyle |= TVIS_BOLD;
DWORD dwExisting = GetItemState( hFolder, dwMask ) & dwMask;
if ( dwExisting != dwStyle ) SetItemState( hFolder, dwStyle, dwMask );
}
if ( nUpdateCookie )
{
if ( bRecurse || ( GetItemState( hFolder, TVIS_SELECTED ) & TVIS_SELECTED ) )
{
pFolder->m_nSelectCookie = nUpdateCookie;
bRecurse |= ( GetItemState( hFolder, TVIS_EXPANDED ) & TVIS_EXPANDED ) == 0;
}
}
CPtrList pAlready;
for ( HTREEITEM hItem = GetChildItem( hFolder ) ; hItem ; )
{
HTREEITEM hNext = GetNextSiblingItem( hItem );
CLibraryFolder* pChild = (CLibraryFolder*)GetItemData( hItem );
if ( pFolder->CheckFolder( pChild ) )
{
Update( pChild, hItem, NULL, nUpdateCookie, bRecurse );
pAlready.AddTail( pChild );
}
else
{
DeleteItem( hItem );
}
hItem = hNext;
}
for ( POSITION pos = pFolder->GetFolderIterator() ; pos ; )
{
CLibraryFolder* pChild = pFolder->GetNextFolder( pos );
if ( pAlready.Find( pChild ) == NULL )
{
Update( pChild, NULL, hFolder, nUpdateCookie, bRecurse );
}
}
int nOldImage1, nOldImage2;
GetItemImage( hFolder, nOldImage1, nOldImage2 );
int nImage = ItemHasChildren( hFolder ) && ( GetItemState( hFolder, TVIS_EXPANDED ) & TVIS_EXPANDED );
nImage = nImage ? SHI_FOLDER_OPEN : SHI_FOLDER_CLOSED;
if ( nOldImage1 != nImage ) SetItemImage( hFolder, nImage, nImage );
}
void CLibraryFolderCtrl::SetSelectedCookie(DWORD nUpdateCookie, HTREEITEM hParent, BOOL bSelect)
{
if ( ! hParent ) hParent = m_hRoot;
for ( HTREEITEM hItem = GetChildItem( hParent ) ; hItem ; )
{
BOOL bRecurse = bSelect;
if ( bSelect || ( GetItemState( hItem, TVIS_SELECTED ) & TVIS_SELECTED ) )
{
CLibraryFolder* pFolder = (CLibraryFolder*)GetItemData( hItem );
pFolder->m_nSelectCookie = nUpdateCookie;
if ( ( GetItemState( hItem, TVIS_EXPANDED ) & TVIS_EXPANDED ) == 0 ) bRecurse = TRUE;
}
SetSelectedCookie( nUpdateCookie, hItem, bRecurse );
hItem = GetNextSiblingItem( hItem );
}
}
POSITION CLibraryFolderCtrl::GetSelectedFolderIterator() const
{
return (POSITION)GetFirstSelectedItem();
}
CLibraryFolder* CLibraryFolderCtrl::GetNextSelectedFolder(POSITION& pos) const
{
CLibraryFolder* pFolder = NULL;
do
{
if ( pos == NULL ) return NULL;
HTREEITEM hItem = (HTREEITEM)pos;
pos = (POSITION)GetNextSelectedItem( hItem );
if ( hItem == m_hRoot ) continue;
CPtrList pTree;
while ( hItem != m_hRoot )
{
pTree.AddHead( (LPVOID)hItem );
hItem = GetParentItem( hItem );
}
CLibraryFolder* pLastFolder = NULL;
for ( POSITION posTree = pTree.GetHeadPosition() ; posTree ; pLastFolder = pFolder )
{
hItem = (HTREEITEM)pTree.GetNext( posTree );
pFolder = (CLibraryFolder*)GetItemData( hItem );
if ( pLastFolder )
{
if ( pLastFolder->CheckFolder( pFolder ) ) continue;
}
else
{
if ( LibraryFolders.CheckFolder( pFolder ) ) continue;
}
pFolder = NULL;
break;
}
}
while ( pFolder == NULL );
return pFolder;
}
/////////////////////////////////////////////////////////////////////////////
// CLibraryFolderCtrl message handlers
int CLibraryFolderCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if ( CTreeCtrl::OnCreate( lpCreateStruct ) == -1 ) return -1;
SetImageList( ShellIcons.GetObject( 16 ), TVSIL_NORMAL );
m_hRoot = GetRootItem();
m_hFirstSelected = NULL;
return 0;
}
void CLibraryFolderCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
UINT nItemFlags = 0;
HTREEITEM hItem = HitTest( point, &nItemFlags );
if ( nItemFlags == TVHT_ONITEMBUTTON )
{
CTreeCtrl::OnLButtonDown( nFlags, point );
return;
}
if ( ( nFlags & MK_CONTROL ) && m_bMultiSelect )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -