📄 ctrllibraryframe.cpp
字号:
void CLibraryFrame::UpdatePanel(BOOL bForce)
{
if ( ! bForce && ! m_bViewSelection ) return;
m_bViewSelection = FALSE;
m_pViewSelection = m_pView ? &m_pView->m_pSelection : &m_pViewEmpty;
CLibraryPanel* pFirstPanel = NULL;
for ( POSITION pos = m_pPanels.GetHeadPosition() ; pos ; )
{
CLibraryPanel* pPanel = (CLibraryPanel*)m_pPanels.GetNext( pos );
if ( pPanel->CheckAvailable( m_pFolderSelection, m_pViewSelection )
&& pFirstPanel == NULL ) pFirstPanel = pPanel;
}
if ( m_bPanelShow )
{
if ( m_pPanel == NULL || m_pPanel->m_bAvailable == FALSE )
{
SetPanel( pFirstPanel );
}
else
{
SetPanel( m_pPanel );
}
}
}
BOOL CLibraryFrame::Display(CLibraryFolder* pFolder)
{
if ( Settings.Library.ShowVirtual != FALSE ) OnLibraryTreePhysical();
return m_wndTree.SelectFolder( pFolder );
}
BOOL CLibraryFrame::Display(CAlbumFolder* pFolder)
{
if ( Settings.Library.ShowVirtual != TRUE ) OnLibraryTreeVirtual();
return m_wndTree.SelectFolder( pFolder );
}
BOOL CLibraryFrame::Display(CLibraryFile* pFile)
{
if ( Settings.Library.ShowVirtual )
{
if ( CAlbumFolder* pFolder = Library.GetAlbumRoot()->FindFile( pFile ) )
{
Display( pFolder );
}
else
{
Display( pFile->m_pFolder );
}
}
else
{
Settings.Library.FilterURI.Empty();
Display( pFile->m_pFolder );
}
return Select( pFile->m_nIndex );
}
BOOL CLibraryFrame::Select(DWORD nObject)
{
if ( m_pView == NULL ) return FALSE;
return m_pView->Select( nObject );
}
/////////////////////////////////////////////////////////////////////////////
// CLibraryFrame selection events
CLibraryTreeItem* CLibraryFrame::GetFolderSelection() const
{
return m_pFolderSelection;
}
CLibraryList* CLibraryFrame::GetViewSelection() const
{
return m_pViewSelection;
}
void CLibraryFrame::OnTreeSelection(NMHDR* pNotify, LRESULT* pResult)
{
if ( ! m_bUpdating ) Update( TRUE, TRUE );
*pResult = 0;
}
void CLibraryFrame::OnViewSelection()
{
if ( m_bUpdating ) return;
m_bViewSelection = TRUE;
PostMessage( WM_TIMER, 1 );
}
void CLibraryFrame::OnTimer(UINT nIDEvent)
{
if ( m_bViewSelection ) UpdatePanel( FALSE );
}
void CLibraryFrame::OnFilterTypes()
{
if ( CSchema* pSchema = m_wndTreeTypes.GetSelected() )
{
Settings.Library.FilterURI = pSchema->m_sURI;
}
else
{
Settings.Library.FilterURI.Empty();
}
Update();
}
/////////////////////////////////////////////////////////////////////////////
// CLibraryFrame drag & drop
void CLibraryFrame::DragObjects(CLibraryList* pList, CImageList* pImage, const CPoint& ptMouse)
{
ASSERT( m_pDragList == NULL );
m_pDragList = pList;
m_pDragImage = pImage;
CPoint ptStart( ptMouse );
ScreenToClient( &ptStart );
CRect rcClient;
GetClientRect( &rcClient );
ClientToScreen( &rcClient );
ClipCursor( &rcClient );
SetCapture();
SetFocus();
UpdateWindow();
OnSetCursor( NULL, 0, 0 );
m_pDragImage->DragEnter( this, ptStart );
}
void CLibraryFrame::CancelDrag()
{
if ( m_pDragList == NULL ) return;
ClipCursor( NULL );
ReleaseCapture();
m_pDragImage->DragLeave( this );
m_pDragImage->EndDrag();
delete m_pDragImage;
m_pDragImage = NULL;
delete m_pDragList;
m_pDragList = NULL;
m_wndTree.DropObjects( NULL, FALSE );
}
void CLibraryFrame::OnMouseMove(UINT nFlags, CPoint point)
{
if ( m_pDragList == NULL ) return;
m_pDragImage->DragMove( point );
ClientToScreen( &point );
m_wndTree.DropShowTarget( m_pDragList, point );
}
void CLibraryFrame::OnLButtonUp(UINT nFlags, CPoint point)
{
if ( m_pDragList == NULL ) return;
ClipCursor( NULL );
ReleaseCapture();
m_pDragImage->DragLeave( this );
m_pDragImage->EndDrag();
delete m_pDragImage;
m_pDragImage = NULL;
ClientToScreen( &point );
BOOL bCopy = FALSE;
if ( Settings.Library.ShowVirtual )
{
bCopy = ( nFlags & MK_SHIFT ) == 0;
}
else
{
bCopy = ( nFlags & MK_CONTROL ) != 0;
}
Library.Lock();
m_wndTree.DropObjects( m_pDragList, bCopy );
Library.Unlock( TRUE );
delete m_pDragList;
m_pDragList = NULL;
}
void CLibraryFrame::OnRButtonDown(UINT nFlags, CPoint point)
{
if ( m_pDragList != NULL )
{
CancelDrag();
return;
}
CWnd::OnRButtonDown( nFlags, point );
}
void CLibraryFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if ( nChar == VK_ESCAPE ) CancelDrag();
if ( m_pDragList ) OnSetCursor( NULL, 0, 0 );
CWnd::OnKeyDown( nChar, nRepCnt, nFlags );
}
void CLibraryFrame::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if ( m_pDragList ) OnSetCursor( NULL, 0, 0 );
CWnd::OnKeyUp( nChar, nRepCnt, nFlags );
}
/////////////////////////////////////////////////////////////////////////////
// CLibraryFrame command handlers
void CLibraryFrame::OnUpdateLibraryTreePhysical(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( Settings.Library.ShowVirtual == FALSE );
}
void CLibraryFrame::OnLibraryTreePhysical()
{
if ( Settings.Library.ShowVirtual != FALSE )
{
Settings.Library.ShowVirtual = FALSE;
OnSkinChange();
m_wndTreeBottom.Invalidate();
}
}
void CLibraryFrame::OnUpdateLibraryTreeVirtual(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( Settings.Library.ShowVirtual == TRUE );
}
void CLibraryFrame::OnLibraryTreeVirtual()
{
if ( Settings.Library.ShowVirtual != TRUE )
{
Settings.Library.ShowVirtual = TRUE;
OnSkinChange();
m_wndTreeBottom.Invalidate();
}
}
void CLibraryFrame::OnLibraryRefresh()
{
CWaitCursor pCursor;
Update( TRUE );
}
void CLibraryFrame::OnUpdateLibraryPanel(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( m_pPanel != NULL );
}
void CLibraryFrame::OnLibraryPanel()
{
if ( m_pPanel )
{
m_bPanelShow = FALSE;
SetPanel( NULL );
}
else
{
m_bPanelShow = TRUE;
Update( TRUE );
}
}
void CLibraryFrame::OnLibrarySearch()
{
CNewSearchDlg dlg( NULL, NULL, TRUE );
if ( dlg.DoModal() == IDOK )
{
RunLocalSearch( dlg.GetSearch() );
}
}
void CLibraryFrame::OnLibrarySearchQuick()
{
CString str;
m_wndSearch.GetWindowText( str );
if ( str.GetLength() > 0 )
{
CQuerySearch* pSearch = new CQuerySearch();
pSearch->m_sSearch = str;
RunLocalSearch( pSearch );
m_wndSearch.SetWindowText( _T("") );
}
else
{
OnLibrarySearch();
}
}
void CLibraryFrame::OnToolbarReturn()
{
if ( GetFocus() == &m_wndSearch )
{
if ( m_wndSearch.GetWindowTextLength() > 0 )
OnLibrarySearchQuick();
else if ( m_pView != NULL )
m_pView->SetFocus();
}
}
void CLibraryFrame::OnToolbarEscape()
{
if ( GetFocus() == &m_wndSearch )
{
m_wndSearch.SetWindowText( _T("") );
if ( m_pView != NULL ) m_pView->SetFocus();
}
}
void CLibraryFrame::RunLocalSearch(CQuerySearch* pSearch)
{
CWaitCursor pCursor;
pSearch->BuildWordList();
CAlbumFolder* pRoot = Library.GetAlbumRoot();
CAlbumFolder* pFolder = pRoot->GetFolder( _T("Search Results") );
if ( pFolder == NULL )
pFolder = pRoot->AddFolder( CSchema::uriSearchFolder, _T("Search Results") );
else
pFolder->Clear();
if ( pFolder->m_pSchema != NULL )
{
CString strDate, strTime;
SYSTEMTIME pTime;
GetLocalTime( &pTime );
GetDateFormat( LOCALE_USER_DEFAULT, 0, &pTime, _T("yyyy-MM-dd"), strDate.GetBuffer( 64 ), 64 );
GetTimeFormat( LOCALE_USER_DEFAULT, 0, &pTime, _T("hh:mm tt"), strTime.GetBuffer( 64 ), 64 );
strDate.ReleaseBuffer(); strTime.ReleaseBuffer();
CXMLElement* pOuter = pFolder->m_pSchema->Instantiate();
CXMLElement* pInner = pOuter->AddElement( _T("searchFolder") );
pInner->AddAttribute( _T("title"), _T("Search Results") );
pInner->AddAttribute( _T("content"), pSearch->m_sSearch );
pInner->AddAttribute( _T("date"), strDate );
pInner->AddAttribute( _T("time"), strTime );
pFolder->SetMetadata( pOuter );
delete pOuter;
}
CPtrList* pFiles = Library.Search( pSearch, 0, TRUE );
if ( pFiles != NULL )
{
for ( POSITION pos = pFiles->GetHeadPosition() ; pos ; )
{
CLibraryFile* pFile = (CLibraryFile*)pFiles->GetNext( pos );
if ( Settings.Search.SchemaTypes && pSearch->m_pSchema != NULL )
{
if ( pSearch->m_pSchema->FilterType( pFile->m_sName, TRUE ) == FALSE )
pFile = NULL;
}
if ( pFile != NULL && pFile->IsAvailable() ) pFolder->AddFile( pFile );
}
delete pFiles;
Library.Unlock();
}
delete pSearch;
Update();
Display( pFolder );
}
void CLibraryFrame::OnSetFocus(CWnd* pOldWnd)
{
CWnd::OnSetFocus( pOldWnd );
if ( m_pView != NULL && IsWindow( m_pView->m_hWnd ) && m_pView->IsWindowVisible() )
m_pView->SetFocus();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -