/** * @brief Set root-paths of current compare so we can add them to report. */ void DirCmpReport::SetRootPaths(const PathContext &paths) { m_rootPaths.SetLeft(paths.GetLeft().c_str()); m_rootPaths.SetRight(paths.GetRight().c_str()); LangFormatString2(m_sTitle, IDS_DIRECTORY_REPORT_TITLE, m_rootPaths.GetLeft().c_str(), m_rootPaths.GetRight().c_str()); }
/** * @brief Initialise directory compare for given paths. * * Initialises directory compare with paths given and recursive choice. * Previous compare context is first free'd. * @param [in] paths Paths to compare * @param [in] bRecursive If TRUE subdirectories are included to compare. */ void CDirDoc::InitCompare(const PathContext & paths, BOOL bRecursive, CTempPathContext *pTempPathContext) { m_pDirView->DeleteAllDisplayItems(); // Anything that can go wrong here will yield an exception. // Default implementation of operator new() never returns NULL. delete m_pCtxt; if (m_pCompareStats == NULL) m_pCompareStats = new CompareStats(); m_pCtxt = new CDiffContext(paths.GetLeft().c_str(), paths.GetRight().c_str(), GetOptionsMgr()->GetInt(OPT_CMP_METHOD)); m_pCtxt->m_bRecursive = !!bRecursive; if (pTempPathContext) { ApplyLeftDisplayRoot(pTempPathContext->m_strLeftDisplayRoot); ApplyRightDisplayRoot(pTempPathContext->m_strRightDisplayRoot); pTempPathContext->m_pParent = m_pTempPathContext; m_pTempPathContext = pTempPathContext; m_pTempPathContext->m_strLeftRoot = m_pCtxt->GetNormalizedLeft(); m_pTempPathContext->m_strRightRoot = m_pCtxt->GetNormalizedRight(); } m_bRecursive = bRecursive; // All plugin management is done by our plugin manager m_pCtxt->m_piPluginInfos = &m_pluginman; }
/** * @brief Update changed item's compare status * @param [in] paths Paths for files we update * @param [in] nDiffs Total amount of differences * @param [in] nTrivialDiffs Amount of ignored differences * @param [in] bIdentical TRUE if files became identical, FALSE otherwise. */ void CDirDoc::UpdateChangedItem(PathContext &paths, UINT nDiffs, UINT nTrivialDiffs, BOOL bIdentical) { UINT_PTR pos = FindItemFromPaths(paths.GetLeft().c_str(), paths.GetRight().c_str()); // If we failed files could have been swapped so lets try again if (!pos) pos = FindItemFromPaths(paths.GetRight().c_str(), paths.GetLeft().c_str()); // Update status if paths were found for items. // Fail means we had unique items compared as 'renamed' items // so there really is not status to update. if (pos > 0) { int ind = m_pDirView->GetItemIndex(pos); // Figure out new status code UINT diffcode = (bIdentical ? DIFFCODE::SAME : DIFFCODE::DIFF); // Update both views and diff context memory SetDiffCompare(diffcode, ind); if (nDiffs != -1 && nTrivialDiffs != -1) SetDiffCounts(nDiffs, nTrivialDiffs, ind); ReloadItemStatus(ind, TRUE, TRUE); } }
static UINT UpdateButtonStatesThread(LPVOID lpParam) { MSG msg; BOOL bRet; CoInitialize(NULL); CAssureScriptsForThread scriptsForRescan; while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) { if (bRet == -1) break; if (msg.message != WM_USER + 2) continue; BOOL bButtonEnabled = TRUE; BOOL bInvalid[3] = {FALSE, FALSE, FALSE}; int iStatusMsgId = 0; int iUnpackerStatusMsgId = 0; UpdateButtonStatesThreadParams *pParams = reinterpret_cast<UpdateButtonStatesThreadParams *>(msg.wParam); PathContext paths = pParams->m_paths; HWND hWnd = pParams->m_hWnd; delete pParams; // Check if we have project file as left side path BOOL bProject = FALSE; String ext; paths_SplitFilename(paths[0], NULL, NULL, &ext); if (paths[1].empty() && string_compare_nocase(ext, ProjectFile::PROJECTFILE_EXT) == 0) bProject = TRUE; if (!bProject) { if (paths_DoesPathExist(paths[0], IsArchiveFile) == DOES_NOT_EXIST) bInvalid[0] = TRUE; if (paths_DoesPathExist(paths[1], IsArchiveFile) == DOES_NOT_EXIST) bInvalid[1] = TRUE; if (paths.GetSize() > 2 && paths_DoesPathExist(paths[2], IsArchiveFile) == DOES_NOT_EXIST) bInvalid[2] = TRUE; } // Enable buttons as appropriate if (GetOptionsMgr()->GetBool(OPT_VERIFY_OPEN_PATHS)) { PATH_EXISTENCE pathsType = DOES_NOT_EXIST; if (paths.GetSize() <= 2) { if (bInvalid[0] && bInvalid[1]) iStatusMsgId = IDS_OPEN_BOTHINVALID; else if (bInvalid[0]) iStatusMsgId = IDS_OPEN_LEFTINVALID; else if (bInvalid[1]) iStatusMsgId = IDS_OPEN_RIGHTINVALID; else if (!bInvalid[0] && !bInvalid[1]) { pathsType = GetPairComparability(paths, IsArchiveFile); if (pathsType == DOES_NOT_EXIST) iStatusMsgId = IDS_OPEN_MISMATCH; else iStatusMsgId = IDS_OPEN_FILESDIRS; } } else { if (bInvalid[0] && bInvalid[1] && bInvalid[2]) iStatusMsgId = IDS_OPEN_ALLINVALID; else if (!bInvalid[0] && bInvalid[1] && bInvalid[2]) iStatusMsgId = IDS_OPEN_MIDDLERIGHTINVALID; else if (bInvalid[0] && !bInvalid[1] && bInvalid[2]) iStatusMsgId = IDS_OPEN_LEFTRIGHTINVALID; else if (!bInvalid[0] && !bInvalid[1] && bInvalid[2]) iStatusMsgId = IDS_OPEN_RIGHTINVALID; else if (bInvalid[0] && bInvalid[1] && !bInvalid[2]) iStatusMsgId = IDS_OPEN_LEFTMIDDLEINVALID; else if (!bInvalid[0] && bInvalid[1] && !bInvalid[2]) iStatusMsgId = IDS_OPEN_MIDDLEINVALID; else if (bInvalid[0] && !bInvalid[1] && !bInvalid[2]) iStatusMsgId = IDS_OPEN_LEFTINVALID; else if (!bInvalid[0] && !bInvalid[1] && !bInvalid[2]) { pathsType = GetPairComparability(paths, IsArchiveFile); if (pathsType == DOES_NOT_EXIST) iStatusMsgId = IDS_OPEN_MISMATCH; else iStatusMsgId = IDS_OPEN_FILESDIRS; } } if (pathsType == IS_EXISTING_FILE || bProject) iUnpackerStatusMsgId = 0; //Empty field else iUnpackerStatusMsgId = IDS_OPEN_UNPACKERDISABLED; if (bProject) bButtonEnabled = TRUE; else bButtonEnabled = (pathsType != DOES_NOT_EXIST); } PostMessage(hWnd, WM_USER + 1, bButtonEnabled, MAKELPARAM(iStatusMsgId, iUnpackerStatusMsgId)); } CoUninitialize(); return 0; }