void CLibraryDetailView::OnItemChanged(NM_LISTVIEW* pNotify, LRESULT* pResult)
{
	*pResult = 0;

	if ( pNotify->iItem >= 0 )
	{
		if ( ( pNotify->uOldState & LVIS_SELECTED ) != ( pNotify->uNewState & LVIS_SELECTED ) )
		{
			if ( pNotify->uNewState & LVIS_SELECTED )
			{
				SelAdd( m_pList[ pNotify->iItem ].nIndex );
				m_pList[ pNotify->iItem ].nState |= LDVI_SELECTED;
			}
			else
			{
				SelRemove( m_pList[ pNotify->iItem ].nIndex );
				m_pList[ pNotify->iItem ].nState &= ~LDVI_SELECTED;
			}
		}
	}
	else
	{
		SelClear();

		LDVITEM* pItem = m_pList;
		for ( DWORD nCount = m_nList ; nCount ; nCount--, pItem++ ) pItem->nState &= ~LDVI_SELECTED;
	}
}
void CLibraryDetailView::OnItemRangeChanged(NMLVODSTATECHANGE* pNotify, LRESULT* pResult)
{
	*pResult = 0;

	for ( int nItem = pNotify->iFrom ; nItem <= pNotify->iTo ; nItem++ )
	{
		if ( pNotify->uNewState & LVIS_SELECTED )
		{
			SelAdd( m_pList[ nItem ].nIndex );
			m_pList[ nItem ].nState |= LDVI_SELECTED;
		}
		else
		{
			SelRemove( m_pList[ nItem ].nIndex );
			m_pList[ nItem ].nState &= ~LDVI_SELECTED;
		}
	}
}
Exemplo n.º 3
0
BOOL CLibraryTileView::Select(iterator pTile, TRISTATE bSelect)
{
	CSingleLock oLock( &Library.m_pSection );
	if ( ! oLock.Lock( 250 ) )
		return FALSE;

	CAlbumFolder* pAlbum = (*pTile)->GetAlbum();
	if ( ! pAlbum )
		return FALSE;

	switch ( bSelect )
	{
	case TRI_UNKNOWN:
		(*pTile)->m_bSelected = ! (*pTile)->m_bSelected;
		break;
	case TRI_FALSE:
		if ( (*pTile)->m_bSelected == FALSE ) return FALSE;
		(*pTile)->m_bSelected = FALSE;
		break;
	case TRI_TRUE:
		if ( (*pTile)->m_bSelected == TRUE ) return FALSE;
		(*pTile)->m_bSelected = TRUE;
		break;
	}

	if ( (*pTile)->m_bSelected )
	{
		m_nSelected++;
		m_oSelTile.push_back( pTile );
		SelAdd( pAlbum );
	}
	else
	{
		m_nSelected--;
		SelRemove( pAlbum );
		m_oSelTile.remove( pTile );
	}

	return TRUE;
}
BOOL CLibraryAlbumView::Select(CLibraryAlbumTrack* pTrack, TRISTATE bSelect)
{
	switch ( bSelect )
	{
	case TRI_UNKNOWN:
		pTrack->m_bSelected = ! pTrack->m_bSelected;
		break;
	case TRI_FALSE:
		if ( pTrack->m_bSelected == FALSE ) return FALSE;
		pTrack->m_bSelected = FALSE;
		break;
	case TRI_TRUE:
		if ( pTrack->m_bSelected == TRUE ) return FALSE;
		pTrack->m_bSelected = TRUE;
		break;
	}

	if ( pTrack->m_bSelected )
	{
		if ( m_pSelTrack.Find( pTrack ) == NULL )
		{
			m_nSelected++;
			SelAdd( pTrack->m_nIndex );
			m_pSelTrack.AddTail( pTrack );
		}
	}
	else
	{
		if ( POSITION pos = m_pSelTrack.Find( pTrack ) )
		{
			m_nSelected--;
			SelRemove( pTrack->m_nIndex );
			m_pSelTrack.RemoveAt( pos );
		}
	}

	return TRUE;
}
void CLibraryDetailView::Update()
{
	GET_LIST();
	
	CSchema* pSchema	= SchemaCache.Get( Settings.Library.FilterURI );
	DWORD nCookie		= GetFolderCookie();
	
	if ( Settings.Library.ShowVirtual ) pSchema = NULL;
	
	if ( m_nStyle == LVS_REPORT )
	{
		CLibraryTreeItem* pTree = GetFolderSelection();
		
		if ( pTree != NULL && pTree->m_pVirtual != NULL && pTree->m_pSelNext == NULL &&
			 pTree->m_pVirtual->m_pSchema != NULL )
		{
			CString strURI = pTree->m_pVirtual->m_pSchema->GetContainedURI( CSchema::stFile );
			
			if ( strURI.GetLength() && ( m_pSchema == NULL || m_pSchema->m_sURI != strURI ) )
			{
				if ( CSchema* pSchema = SchemaCache.Get( strURI ) )
				{
					CPtrList pColumns;
					CSchemaColumnsDlg::LoadColumns( pSchema, &pColumns );
					SetViewSchema( pSchema, &pColumns, TRUE, FALSE );
				}
			}
		}
	}

	LDVITEM* pItem = m_pList + m_nList - 1;

	for ( DWORD nCount = m_nList ; nCount ; nCount--, pItem-- )
	{
		CLibraryFile* pFile = Library.LookupFile( pItem->nIndex );
		
		if ( pFile && pFile->m_nSelectCookie == nCookie && pFile->IsAvailable() &&
			 ( ! pSchema || pSchema->Equals( pFile->m_pSchema ) ||
			 ( ! pFile->m_pMetadata && pSchema->FilterType( pFile->m_sName ) ) ) )
		{
			pFile->m_nListCookie = nCookie;
		}
		else
		{
			SelRemove( pItem->nIndex );
			CStringArray* pSaved = pItem->pText;
			CopyMemory( pItem, pItem + 1, sizeof(LDVITEM) * ( m_nList - nCount ) );
			pItem[ m_nList - nCount ].pText = pSaved;
			m_nList--;
		}
	}

	for ( POSITION pos = LibraryMaps.GetFileIterator() ; pos ; )
	{
		CLibraryFile* pFile = LibraryMaps.GetNextFile( pos );

		if ( pFile->m_nSelectCookie == nCookie &&
 			 pFile->m_nListCookie != nCookie &&
			 pFile->IsAvailable() &&
			 ( ! pSchema || pSchema->Equals( pFile->m_pSchema ) ||
			 ( ! pFile->m_pMetadata && pSchema->FilterType( pFile->m_sName ) ) ) )
		{
			if ( m_nList == m_nBuffer )	// MUST EQUAL
			{
				m_nBuffer += 64;
				LDVITEM* pList = new LDVITEM[ m_nBuffer ];
				if ( m_nList ) CopyMemory( pList, m_pList, m_nList * sizeof(LDVITEM) );
				if ( m_pList ) delete [] m_pList;
				ZeroMemory( pList + m_nList, ( m_nBuffer - m_nList ) * sizeof(LDVITEM) );
				m_pList = pList;
			}
			
			m_pList[ m_nList ].nIndex		= pFile->m_nIndex;
			m_pList[ m_nList ].nState		&= ~LDVI_SELECTED;
			m_nList++;
			
			pFile->m_nListCookie = nCookie;
		}
	}
	
	m_nListCookie++;
	
	SortItems();
}