From aee728e97b575e057636c052f8e638faacf67917 Mon Sep 17 00:00:00 2001 From: Takashi Sawanaka Date: Tue, 9 Jan 2018 00:21:10 +0900 Subject: [PATCH] Introduce the flag DIFFCODE::THREEWAY to indicate whether or not to compare three items --- Src/DiffItem.h | 7 +++-- Src/DirActions.cpp | 11 +++---- Src/DirActions.h | 2 +- Src/DirScan.cpp | 90 +++++++++++++++++++++++++++-------------------------- Src/DirView.cpp | 6 ++-- Src/HexMergeDoc.cpp | 2 +- 6 files changed, 59 insertions(+), 59 deletions(-) diff --git a/Src/DiffItem.h b/Src/DiffItem.h index 40f3419b1..a7c823d59 100644 --- a/Src/DiffItem.h +++ b/Src/DiffItem.h @@ -56,6 +56,7 @@ struct DIFFCODE COMPAREFLAGS3WAY=0x18000, DIFFALL=0x0000, DIFF1STONLY=0x8000, DIFF2NDONLY=0x10000, DIFF3RDONLY=0x18000, FILTERFLAGS=0x20000, INCLUDED=0x00000, SKIPPED=0x20000, SCANFLAGS=0x100000, NEEDSCAN=0x100000, + THREEWAYFLAGS=0x200000, THREEWAY=0x200000, }; unsigned diffcode; @@ -128,9 +129,9 @@ public: default: return 0; } } - bool existAll(int nDirs) const + bool existAll() const { - if (nDirs == 2) + if ((diffcode & DIFFCODE::THREEWAY) == 0) return (existsFirst() && existsSecond()); else return (existsFirst() && existsSecond() && existsThird()); @@ -139,7 +140,7 @@ public: // compare result bool isResultSame() const { return CheckCompare(diffcode, DIFFCODE::SAME); } bool isResultDiff() const { return (CheckCompare(diffcode, DIFFCODE::DIFF) && !isResultFiltered() && - existsFirst() && existsSecond()); } /* FIXME: 3-pane */ + existAll()); } static bool isResultError(unsigned code) { return CheckCompare(code, DIFFCODE::CMPERR); } bool isResultError() const { return isResultError(diffcode); } static bool isResultAbort(unsigned code) { return CheckCompare(code, DIFFCODE::CMPABORT); } diff --git a/Src/DirActions.cpp b/Src/DirActions.cpp index d93e153c4..b33c63caf 100644 --- a/Src/DirActions.cpp +++ b/Src/DirActions.cpp @@ -521,10 +521,7 @@ bool IsItemExistAll(const CDiffContext& ctxt, const DIFFITEM & di) // Not a valid diffitem, one of special items (e.g "..") if (di.diffcode.diffcode == 0) return false; - if (ctxt.GetCompareDirs() == 2) - return di.diffcode.isSideBoth(); - else - return di.diffcode.isSideAll(); + return di.diffcode.existAll(); } @@ -946,7 +943,7 @@ PathContext GetItemFileNames(const CDiffContext& ctxt, const DIFFITEM & di) /** * @brief Return image index appropriate for this row */ -int GetColImage(const CDiffContext&ctxt, const DIFFITEM & di) +int GetColImage(const DIFFITEM & di) { // Must return an image index into image list created above in OnInitDialog if (di.diffcode.isResultError()) @@ -958,12 +955,12 @@ int GetColImage(const CDiffContext&ctxt, const DIFFITEM & di) if (di.diffcode.isSideFirstOnly()) return (di.diffcode.isDirectory() ? DIFFIMG_LDIRUNIQUE : DIFFIMG_LUNIQUE); if (di.diffcode.isSideSecondOnly()) - return (ctxt.GetCompareDirs() < 3 ? + return ((di.diffcode.diffcode & DIFFCODE::THREEWAY) == 0 ? (di.diffcode.isDirectory() ? DIFFIMG_RDIRUNIQUE : DIFFIMG_RUNIQUE) : (di.diffcode.isDirectory() ? DIFFIMG_MDIRUNIQUE : DIFFIMG_MUNIQUE)); if (di.diffcode.isSideThirdOnly()) return (di.diffcode.isDirectory() ? DIFFIMG_RDIRUNIQUE : DIFFIMG_RUNIQUE); - if (ctxt.GetCompareDirs() == 3) + if ((di.diffcode.diffcode & DIFFCODE::THREEWAY) != 0) { if (!di.diffcode.exists(0)) return (di.diffcode.isDirectory() ? DIFFIMG_LDIRMISSING : DIFFIMG_LMISSING); diff --git a/Src/DirActions.h b/Src/DirActions.h index 0e7adf51c..e697652ac 100644 --- a/Src/DirActions.h +++ b/Src/DirActions.h @@ -159,7 +159,7 @@ bool GetOpenThreeItems(const CDiffContext& ctxt, uintptr_t pos1, uintptr_t pos2, void GetItemFileNames(const CDiffContext& ctxt, const DIFFITEM& di, String& strLeft, String& strRight); PathContext GetItemFileNames(const CDiffContext& ctxt, const DIFFITEM& di); String GetItemFileName(const CDiffContext& ctx, const DIFFITEM & di, int index); -int GetColImage(const CDiffContext&ctxt, const DIFFITEM & di); +int GetColImage(const DIFFITEM & di); void SetDiffStatus(DIFFITEM& di, unsigned diffcode, unsigned mask); void SetDiffCompare(DIFFITEM& di, unsigned diffcode); diff --git a/Src/DirScan.cpp b/Src/DirScan.cpp index 55d82fe98..1c22a0d57 100644 --- a/Src/DirScan.cpp +++ b/Src/DirScan.cpp @@ -51,8 +51,8 @@ static void StoreDiffData(DIFFITEM &di, CDiffContext * pCtxt, const FolderCmp * pCmpData); static DIFFITEM *AddToList(const String& sLeftDir, const String& sRightDir, const DirItem * lent, const DirItem * rent, unsigned code, DiffFuncStruct *myStruct, DIFFITEM *parent); -static DIFFITEM *AddToList(const String& sLeftDir, const String& sMiddleDir, const String& sRightDir, const DirItem * lent, const DirItem * ment, const DirItem * rent, - unsigned code, DiffFuncStruct *myStruct, DIFFITEM *parent); +static DIFFITEM *AddToList(const String& sDir1, const String& sDir2, const String& sDir3, const DirItem * ent1, const DirItem * ent2, const DirItem * ent3, + unsigned code, DiffFuncStruct *myStruct, DIFFITEM *parent, int nItems = 3); static void UpdateDiffItem(DIFFITEM & di, bool & bExists, CDiffContext *pCtxt); static int CompareItems(NotificationQueue& queue, DiffFuncStruct *myStruct, uintptr_t parentdiffpos); @@ -510,7 +510,7 @@ static int CompareItems(NotificationQueue& queue, DiffFuncStruct *myStruct, uint myStruct->pSemaphore->wait(); uintptr_t curpos = pos; DIFFITEM &di = pCtxt->GetNextSiblingDiffRefPosition(pos); - bool existsalldirs = ((pCtxt->GetCompareDirs() == 2 && di.diffcode.isSideBoth()) || (pCtxt->GetCompareDirs() == 3 && di.diffcode.isSideAll())); + bool existsalldirs = di.diffcode.existAll(); if (di.diffcode.isDirectory() && pCtxt->m_bRecursive) { di.diffcode.diffcode &= ~(DIFFCODE::DIFF | DIFFCODE::SAME); @@ -544,9 +544,8 @@ static int CompareItems(NotificationQueue& queue, DiffFuncStruct *myStruct, uint WorkCompletedNotification* pWorkCompletedNf = dynamic_cast(pNf.get()); if (pWorkCompletedNf) { DIFFITEM &di = pWorkCompletedNf->data(); - bool existsalldirs = ((pCtxt->GetCompareDirs() == 2 && di.diffcode.isSideBoth()) || (pCtxt->GetCompareDirs() == 3 && di.diffcode.isSideAll())); if (di.diffcode.isResultDiff() || - (!existsalldirs && !di.diffcode.isResultFiltered())) + (!di.diffcode.existAll() && !di.diffcode.isResultFiltered())) res++; } --count; @@ -578,7 +577,7 @@ static int CompareRequestedItems(DiffFuncStruct *myStruct, uintptr_t parentdiffp uintptr_t curpos = pos; DIFFITEM &di = pCtxt->GetNextSiblingDiffRefPosition(pos); - bool existsalldirs = ((pCtxt->GetCompareDirs() == 2 && di.diffcode.isSideBoth()) || (pCtxt->GetCompareDirs() == 3 && di.diffcode.isSideAll())); + bool existsalldirs = di.diffcode.existAll(); if (di.diffcode.isDirectory()) { if (pCtxt->m_bRecursive) @@ -827,15 +826,15 @@ static DIFFITEM *AddToList(const String& sLeftDir, const String& sRightDir, const DirItem * lent, const DirItem * rent, unsigned code, DiffFuncStruct *myStruct, DIFFITEM *parent) { - return AddToList(sLeftDir, sRightDir, sLeftDir, lent, rent, 0, code, myStruct, parent); + return AddToList(sLeftDir, sRightDir, sLeftDir, lent, rent, 0, code, myStruct, parent, 2); } /** * @brief Add one compare item to list. */ -static DIFFITEM *AddToList(const String& sLeftDir, const String& sMiddleDir, const String& sRightDir, - const DirItem * lent, const DirItem * ment, const DirItem * rent, - unsigned code, DiffFuncStruct *myStruct, DIFFITEM *parent) +static DIFFITEM *AddToList(const String& sDir1, const String& sDir2, const String& sDir3, + const DirItem * ent1, const DirItem * ent2, const DirItem * ent3, + unsigned code, DiffFuncStruct *myStruct, DIFFITEM *parent, int nItems) { // We must store both paths - we cannot get paths later // and we need unique item paths for example when items @@ -843,62 +842,65 @@ static DIFFITEM *AddToList(const String& sLeftDir, const String& sMiddleDir, con DIFFITEM *di = myStruct->context->AddDiff(parent); di->parent = parent; - di->diffFileInfo[0].path = sLeftDir; - di->diffFileInfo[1].path = sMiddleDir; - di->diffFileInfo[2].path = sRightDir; + di->diffFileInfo[0].path = sDir1; + di->diffFileInfo[1].path = sDir2; + di->diffFileInfo[2].path = sDir3; - if (lent) + if (ent1) { - di->diffFileInfo[0].filename = lent->filename; - di->diffFileInfo[0].mtime = lent->mtime; - di->diffFileInfo[0].ctime = lent->ctime; - di->diffFileInfo[0].size = lent->size; - di->diffFileInfo[0].flags.attributes = lent->flags.attributes; + di->diffFileInfo[0].filename = ent1->filename; + di->diffFileInfo[0].mtime = ent1->mtime; + di->diffFileInfo[0].ctime = ent1->ctime; + di->diffFileInfo[0].size = ent1->size; + di->diffFileInfo[0].flags.attributes = ent1->flags.attributes; } else { // Don't break CDirView::DoCopyRightToLeft() - if (rent) - di->diffFileInfo[0].filename = rent->filename; - else if (ment) - di->diffFileInfo[0].filename = ment->filename; + if (ent3) + di->diffFileInfo[0].filename = ent3->filename; + else if (ent2) + di->diffFileInfo[0].filename = ent2->filename; } - if (ment) + if (ent2) { - di->diffFileInfo[1].filename = ment->filename; - di->diffFileInfo[1].mtime = ment->mtime; - di->diffFileInfo[1].ctime = ment->ctime; - di->diffFileInfo[1].size = ment->size; - di->diffFileInfo[1].flags.attributes = ment->flags.attributes; + di->diffFileInfo[1].filename = ent2->filename; + di->diffFileInfo[1].mtime = ent2->mtime; + di->diffFileInfo[1].ctime = ent2->ctime; + di->diffFileInfo[1].size = ent2->size; + di->diffFileInfo[1].flags.attributes = ent2->flags.attributes; } else { // Don't break CDirView::DoCopyLeftToRight() - if (lent) - di->diffFileInfo[1].filename = lent->filename; - else if (rent) - di->diffFileInfo[1].filename = rent->filename; + if (ent1) + di->diffFileInfo[1].filename = ent1->filename; + else if (ent3) + di->diffFileInfo[1].filename = ent3->filename; } - if (rent) + if (ent3) { - di->diffFileInfo[2].filename = rent->filename; - di->diffFileInfo[2].mtime = rent->mtime; - di->diffFileInfo[2].ctime = rent->ctime; - di->diffFileInfo[2].size = rent->size; - di->diffFileInfo[2].flags.attributes = rent->flags.attributes; + di->diffFileInfo[2].filename = ent3->filename; + di->diffFileInfo[2].mtime = ent3->mtime; + di->diffFileInfo[2].ctime = ent3->ctime; + di->diffFileInfo[2].size = ent3->size; + di->diffFileInfo[2].flags.attributes = ent3->flags.attributes; } else { // Don't break CDirView::DoCopyLeftToRight() - if (lent) - di->diffFileInfo[2].filename = lent->filename; - else if (ment) - di->diffFileInfo[2].filename = ment->filename; + if (ent1) + di->diffFileInfo[2].filename = ent1->filename; + else if (ent2) + di->diffFileInfo[2].filename = ent2->filename; } - di->diffcode.diffcode = code; + if (nItems == 2) + di->diffcode.diffcode = code; + else + di->diffcode.diffcode = code | DIFFCODE::THREEWAY; myStruct->context->m_pCompareStats->IncreaseTotalItems(); myStruct->pSemaphore->set(); diff --git a/Src/DirView.cpp b/Src/DirView.cpp index 8453a3f5c..2f22b0dfb 100644 --- a/Src/DirView.cpp +++ b/Src/DirView.cpp @@ -511,7 +511,7 @@ void CDirView::RedisplayChildren(uintptr_t diffpos, int level, UINT &index, int uintptr_t curdiffpos = diffpos; const DIFFITEM &di = ctxt.GetNextSiblingDiffPosition(diffpos); - if (di.diffcode.isResultDiff() || (!di.diffcode.existAll(pDoc->m_nDirs) && !di.diffcode.isResultFiltered())) + if (di.diffcode.isResultDiff() || (!di.diffcode.existAll() && !di.diffcode.isResultFiltered())) ++alldiffs; bool bShowable = IsShowable(ctxt, di, m_dirfilter); @@ -530,7 +530,7 @@ void CDirView::RedisplayChildren(uintptr_t diffpos, int level, UINT &index, int } else { - if (!ctxt.m_bRecursive || !di.diffcode.isDirectory() || !di.diffcode.existAll(pDoc->m_nDirs)) + if (!ctxt.m_bRecursive || !di.diffcode.isDirectory() || !di.diffcode.existAll()) { AddNewItem(index, curdiffpos, I_IMAGECALLBACK, 0); index++; @@ -3865,7 +3865,7 @@ void CDirView::ReflectGetdispinfo(NMLVDISPINFO *pParam) } if (pParam->item.mask & LVIF_IMAGE) { - pParam->item.iImage = GetColImage(ctxt, di); + pParam->item.iImage = GetColImage(di); } m_bNeedSearchLastDiffItem = true; diff --git a/Src/HexMergeDoc.cpp b/Src/HexMergeDoc.cpp index 0a28a2073..a513e5c6c 100644 --- a/Src/HexMergeDoc.cpp +++ b/Src/HexMergeDoc.cpp @@ -80,7 +80,7 @@ static void UpdateDiffItem(int nBuffers, DIFFITEM &di, CDiffContext *pCtxt) di.diffcode.diffcode &= ~(DIFFCODE::TEXTFLAGS | DIFFCODE::COMPAREFLAGS); // 2. Process unique files // We must compare unique files to itself to detect encoding - if (!di.diffcode.existAll(nBuffers)) + if (!di.diffcode.existAll()) { int compareMethod = pCtxt->GetCompareMethod(); if (compareMethod != CMP_DATE && compareMethod != CMP_DATE_SIZE && -- 2.11.0