void CBottomView::UseViewBlock(CBaseView * pwndView) { if (!IsViewGood(pwndView)) return; int nFirstViewLine = 0; // first view line in selection int nLastViewLine = 0; // last view line in selection if (!GetViewSelection(nFirstViewLine, nLastViewLine)) return; return UseBlock(pwndView, nFirstViewLine, nLastViewLine); }
void CLeftView::UseRightBlock() { int nFirstViewLine = 0; int nLastViewLine = 0; if (!IsWritable()) return; if (!GetViewSelection(nFirstViewLine, nLastViewLine)) return; return UseViewBlock(m_pwndRight, nFirstViewLine, nLastViewLine); }
void CLibraryMetaPanel::OnLButtonUp(UINT nFlags, CPoint point) { point.y += GetScrollPos( SB_VERT ); if ( m_nSelected > 0 && m_rcFolder.PtInRect( point ) ) { CQuickLock oLock( Library.m_pSection ); if ( CLibraryFolder* pFolder = LibraryFolders.GetFolder( m_sFolder ) ) { if ( Settings.Library.ShowVirtual ) { CLibraryFrame* pFrame = (CLibraryFrame*)GetOwner(); ASSERT_KINDOF(CLibraryFrame, pFrame ); pFrame->Display( pFolder ); } else if ( LibraryFolders.CheckFolder( pFolder, TRUE ) ) { ShellExecute( AfxGetMainWnd()->GetSafeHwnd(), NULL, m_sFolder, NULL, NULL, SW_SHOWNORMAL ); } } } else if ( m_nSelected > 0 && m_rcRating.PtInRect( point ) ) { CLibraryListPtr pList( GetViewSelection() ); if ( pList && pList->GetCount() > 0 ) { CFilePropertiesSheet dlg; dlg.Add( pList ); dlg.DoModal( 2 ); } } else if ( CMetaItem* pItem = m_pMetadata->HitTest( point, TRUE ) ) { CQuickLock oLock( Library.m_pSection ); if ( CAlbumFolder* pFolder = pItem->GetLinkTarget() ) { CLibraryFrame* pFrame = (CLibraryFrame*)GetOwner(); ASSERT_KINDOF(CLibraryFrame, pFrame ); pFrame->Display( pFolder ); } } CPanelCtrl::OnLButtonUp( nFlags, point ); }
void CLibraryFrame::UpdatePanel(BOOL bForce) { CQuickLock oLock( Library.m_pSection ); if ( ! bForce && ! m_bViewSelection ) return; m_bViewSelection = FALSE; m_pViewSelection = HasView() ? m_pView->GetSelection() : m_pViewEmpty; if ( m_bPanelShow ) { CLibraryTreeItem* pFolders = m_wndTree.GetFirstSelected(); CLibraryListPtr pFiles( GetViewSelection() ); BOOL bMetaPanelAvailable = ( pFolders != NULL ); BOOL bHistoryPanelAvailable = ( LibraryHistory.GetCount() > 0 ); // Do not display any panel for the collection folder if ( pFolders && pFolders->m_pVirtual && pFolders->m_pVirtual->m_oCollSHA1 ) bMetaPanelAvailable = bHistoryPanelAvailable = FALSE; // Prefer history panel if no files selected for meta panel if ( bMetaPanelAvailable && bHistoryPanelAvailable && pFiles && pFiles->GetCount() <= 0 ) bMetaPanelAvailable = FALSE; CPanelCtrl* pBestPanel = bMetaPanelAvailable ? static_cast< CPanelCtrl* >( &m_pMetaPanel ) : ( bHistoryPanelAvailable ? static_cast< CPanelCtrl* >( &m_pHistoryPanel ) : NULL ); if ( ! HasPanel() || m_pPanel != pBestPanel ) SetPanel( pBestPanel ); else SetPanel( m_pPanel ); } }
void CLibraryMetaPanel::Update() { CSingleLock pLock1( &Library.m_pSection, TRUE ); CSingleLock pLock2( &m_pSection, TRUE ); CLibraryListPtr pSel( GetViewSelection() ); m_nSelected = pSel ? static_cast< int >( pSel->GetCount() ) : 0; // Show info for library files only CLibraryFile* pFirst = NULL; if ( m_nSelected ) { const CLibraryListItem& pItem = pSel->GetHead(); if ( pItem.Type == CLibraryListItem::LibraryFile ) pFirst = Library.LookupFile( pItem ); if ( pFirst == NULL ) m_nSelected = 0; } m_nIcon32 = m_nIcon48 = -1; if ( m_nSelected == 1 ) { m_nIndex = pFirst->m_nIndex; m_sName = pFirst->m_sName; m_sPath = pFirst->GetPath(); m_sFolder = pFirst->GetFolder(); m_sSize = Settings.SmartVolume( pFirst->GetSize() ); m_sType = ShellIcons.GetTypeString( m_sName ); m_nIcon32 = ShellIcons.Get( pFirst->GetPath(), 32 ); m_nIcon48 = ShellIcons.Get( pFirst->GetPath(), 48 ); m_nRating = pFirst->m_nRating; } else if ( m_nSelected > 1 ) { CString strFormat; LoadString( strFormat, IDS_LIBPANEL_MULTIPLE_FILES ); m_sName.Format( strFormat, m_nSelected ); QWORD nSize = 0; m_sFolder = pFirst->GetFolder(); m_nIcon32 = ShellIcons.Get( pFirst->GetPath(), 32 ); m_nIcon48 = ShellIcons.Get( pFirst->GetPath(), 48 ); m_nRating = 0; for ( POSITION pos = pSel->GetHeadPosition() ; pos ; ) { CLibraryFile* pFile = Library.LookupFile( pSel->GetNext( pos ) ); if ( pFile == NULL ) continue; nSize += pFile->GetSize() / 1024; if ( pFile->IsAvailable() && pFile->GetFolder().CompareNoCase( m_sFolder ) ) { LoadString( m_sFolder, IDS_LIBPANEL_MULTIPLE_FOLDERS ); } int nIcon = ShellIcons.Get( pFile->GetPath(), 48 ); if ( nIcon != m_nIcon48 ) m_nIcon48 = -1; nIcon = ShellIcons.Get( pFile->GetPath(), 32 ); if ( nIcon != m_nIcon32 ) m_nIcon32 = -1; } m_sSize = Settings.SmartVolume( nSize ); m_sPath.Empty(); m_sType.Empty(); } m_pSchema = NULL; if ( pSel ) { for ( POSITION pos = pSel->GetHeadPosition() ; pos ; ) { const CLibraryListItem& pItem = pSel->GetNext( pos ); if ( pItem.Type != CLibraryListItem::LibraryFile ) continue; CLibraryFile* pFile = Library.LookupFile( pItem ); if ( pFile == NULL ) continue; m_pSchema = pFile->m_pSchema; if ( m_pSchema ) break; } } if ( m_pServiceData ) { m_pMetadata->Setup( m_pServiceData ); } else { m_pMetadata->Setup( m_pSchema ); if ( m_pSchema && pSel ) { for ( POSITION pos = pSel->GetHeadPosition() ; pos ; ) { const CLibraryListItem& pItem = pSel->GetNext( pos ); if ( pItem.Type != CLibraryListItem::LibraryFile ) continue; if ( CLibraryFile* pFile = Library.LookupFile( pItem ) ) { if ( pFile->m_pMetadata != NULL && m_pSchema->Equals( pFile->m_pSchema ) ) { m_pMetadata->Combine( pFile->m_pMetadata ); } } } } } m_pMetadata->CreateLinks(); m_pMetadata->Clean( 4096 ); CClientDC dc( this ); if ( Settings.General.LanguageRTL ) SetLayout( dc.m_hDC, LAYOUT_BITMAPORIENTATIONPRESERVED ); SCROLLINFO pInfo; CRect rc; GetClientRect( &rc ); int nThumbSize = min( max( rc.Height() - 16, 64 ), (int)Settings.Library.ThumbSize ); int nHeight = 54 + m_pMetadata->Layout( &dc, rc.Width() - 24 - nThumbSize ); pInfo.cbSize = sizeof(pInfo); pInfo.fMask = SIF_ALL & ~SIF_TRACKPOS; pInfo.nMin = 0; pInfo.nMax = nHeight; pInfo.nPage = rc.Height(); pInfo.nPos = GetScrollPos( SB_VERT ); pInfo.nPos = max( 0, min( pInfo.nPos, pInfo.nMax - (int)pInfo.nPage + 1 ) ); SetScrollInfo( SB_VERT, &pInfo, TRUE ); if ( m_bForceUpdate || ( m_sThumb != m_sPath ) ) { m_bForceUpdate = FALSE; if ( m_bmThumb.m_hObject ) m_bmThumb.DeleteObject(); if ( ! IsThreadAlive() ) { BeginThread( "CtrlLibraryMetaPanel" ); } } pLock2.Unlock(); pLock1.Unlock(); Invalidate(); }
void CBottomView::UseBothBlocks(CBaseView * pwndFirst, CBaseView * pwndLast) { if (!IsViewGood(pwndFirst) || !IsViewGood(pwndLast)) return; int nFirstViewLine = 0; // first view line in selection int nLastViewLine = 0; // last view line in selection if (!GetViewSelection(nFirstViewLine, nLastViewLine)) return; int nNextViewLine = nLastViewLine + 1; // first view line after selected block CUndo::GetInstance().BeginGrouping(); // start group undo // use (copy) first block for (int viewLine = nFirstViewLine; viewLine <= nLastViewLine; viewLine++) { viewdata lineData = pwndFirst->GetViewData(viewLine); if ((lineData.ending != EOL_NOENDING)||(viewLine < (GetViewCount()-1))) lineData.ending = m_lineendings; lineData.state = ResolveState(lineData.state); SetViewData(viewLine, lineData); if (!IsStateEmpty(pwndFirst->GetViewState(viewLine))) { pwndFirst->SetViewState(viewLine, DIFFSTATE_YOURSADDED); // this is improper (may be DIFFSTATE_THEIRSADDED) but seems not to produce any visible bug } } // make sure previous (non empty) line have EOL set for (int nCheckViewLine = nFirstViewLine-1; nCheckViewLine > 0; nCheckViewLine--) { if (!IsViewLineEmpty(nCheckViewLine)) { if (GetViewLineEnding(nCheckViewLine) == EOL_NOENDING) { SetViewLineEnding(nCheckViewLine, m_lineendings); } break; } } SaveUndoStep(); // use (insert) last block int nViewIndex = nNextViewLine; for (int viewLine = nFirstViewLine; viewLine <= nLastViewLine; viewLine++, nViewIndex++) { viewdata lineData = pwndLast->GetViewData(viewLine); lineData.state = ResolveState(lineData.state); InsertViewData(nViewIndex, lineData); if (!IsStateEmpty(pwndLast->GetViewState(viewLine))) { pwndLast->SetViewState(viewLine, DIFFSTATE_THEIRSADDED); // this is improper but seems not to produce any visible bug } } SaveUndoStep(); // adjust line numbers in target // we fix all line numbers to handle exotic cases UpdateViewLineNumbers(); SaveUndoStep(); // now insert an empty block in both first and last int nCount = nLastViewLine - nFirstViewLine + 1; pwndLast->InsertViewEmptyLines(nFirstViewLine, nCount); pwndFirst->InsertViewEmptyLines(nNextViewLine, nCount); SaveUndoStep(); int nRemovedLines = CleanEmptyLines(); SaveUndoStep(); CUndo::GetInstance().EndGrouping(); // final clean up ClearSelection(); SetupAllViewSelection(nFirstViewLine, 2*nLastViewLine - nFirstViewLine - nRemovedLines + 1); BuildAllScreen2ViewVector(); SetModified(); RefreshViews(); }
void CLeftView::UseBothLeftFirst() { if (!IsRightViewGood()) return; int nFirstViewLine = 0; // first view line in selection int nLastViewLine = 0; // last view line in selection if (!IsWritable()) return; if (!GetViewSelection(nFirstViewLine, nLastViewLine)) return; int nNextViewLine = nLastViewLine + 1; // first view line after selected block CUndo::GetInstance().BeginGrouping(); // right original become added for (int viewLine = nFirstViewLine; viewLine <= nLastViewLine; viewLine++) { if (!IsStateEmpty(GetViewState(viewLine))) { SetViewState(viewLine, DIFFSTATE_REMOVED); } } SaveUndoStep(); // your block is done, now insert their block int viewindex = nNextViewLine; for (int viewLine = nFirstViewLine; viewLine <= nLastViewLine; viewLine++) { viewdata line = m_pwndRight->GetViewData(viewLine); if (IsStateEmpty(line.state)) { line.state = DIFFSTATE_EMPTY; } else { if (line.state!=DIFFSTATE_NORMAL) { m_pwndRight->SetViewState(viewLine, DIFFSTATE_NORMAL); line.state = DIFFSTATE_NORMAL; } SetModified(); } InsertViewData(viewindex++, line); } SaveUndoStep(); // now insert an empty block in right view int nCount = nLastViewLine - nFirstViewLine + 1; m_pwndRight->InsertViewEmptyLines(nFirstViewLine, nCount); m_pwndRight->Invalidate(); SaveUndoStep(); // clean up int nRemovedLines = CleanEmptyLines(); SaveUndoStep(); UpdateViewLineNumbers(); SaveUndoStep(); CUndo::GetInstance().EndGrouping(); // final clean up ClearSelection(); SetupAllViewSelection(nFirstViewLine, 2*nLastViewLine - nFirstViewLine - nRemovedLines + 1); BuildAllScreen2ViewVector(); RefreshViews(); }