OSDN Git Service

Introduce the flag DIFFCODE::THREEWAY to indicate whether or not to compare three...
authorTakashi Sawanaka <sdottaka@users.sourceforge.net>
Mon, 8 Jan 2018 15:21:10 +0000 (00:21 +0900)
committerTakashi Sawanaka <sdottaka@users.sourceforge.net>
Mon, 8 Jan 2018 15:21:10 +0000 (00:21 +0900)
Src/DiffItem.h
Src/DirActions.cpp
Src/DirActions.h
Src/DirScan.cpp
Src/DirView.cpp
Src/HexMergeDoc.cpp

index 40f3419..a7c823d 100644 (file)
@@ -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); }
index d93e153..b33c63c 100644 (file)
@@ -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);
index 0e7adf5..e697652 100644 (file)
@@ -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);
index 55d82fe..1c22a0d 100644 (file)
@@ -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<WorkCompletedNotification*>(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();
index 8453a3f..2f22b0d 100644 (file)
@@ -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;
index 0a28a20..a513e5c 100644 (file)
@@ -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 &&