OSDN Git Service

FolderCompare: Make sub-folder recomparable
authorsdottaka <sdottaka@users.sourceforge.net>
Tue, 17 Feb 2015 03:25:11 +0000 (12:25 +0900)
committersdottaka <sdottaka@users.sourceforge.net>
Tue, 17 Feb 2015 03:25:11 +0000 (12:25 +0900)
--HG--
branch : stable

Src/DiffContext.cpp
Src/DiffItem.cpp
Src/DiffItem.h
Src/DiffThread.cpp
Src/DirDoc.cpp
Src/DirScan.cpp
Src/DirScan.h
Src/DirView.cpp
Translations/WinMerge/English.pot
Translations/WinMerge/Japanese.po

index fa86031..0512a3b 100644 (file)
@@ -119,7 +119,7 @@ void CDiffContext::UpdateStatusFromDisk(uintptr_t diffpos, bool bLeft, bool bRig
  */
 bool CDiffContext::UpdateInfoFromDiskHalf(DIFFITEM & di, int nIndex)
 {
-       String filepath = paths_ConcatPath(di.getFilepath(nIndex, GetNormalizedPath(nIndex)), di.diffFileInfo[nIndex].filename);
+       String filepath = paths_ConcatPath(paths_ConcatPath(m_paths[nIndex], di.diffFileInfo[nIndex].path), di.diffFileInfo[nIndex].filename);
        DiffFileInfo & dfi = di.diffFileInfo[nIndex];
        if (!dfi.Update(filepath))
                return false;
index 694bde9..7cd8561 100644 (file)
@@ -14,12 +14,7 @@ DIFFITEM DIFFITEM::emptyitem;
 /** @brief DIFFITEM's destructor */
 DIFFITEM::~DIFFITEM()
 {
-       while (HasChildren())
-       {
-               DIFFITEM *p = (DIFFITEM *)children.Flink;
-               p->RemoveSelf();
-               delete p;
-       }
+       RemoveChildren();
 }
 
 /** @brief Return path to left/right file, including all but file name */
@@ -63,3 +58,12 @@ bool DIFFITEM::HasChildren() const
        return p ? true : false;
 }
 
+void DIFFITEM::RemoveChildren()
+{
+       while (HasChildren())
+       {
+               DIFFITEM *p = (DIFFITEM *)children.Flink;
+               p->RemoveSelf();
+               delete p;
+       }
+}
index d30c271..0cf9b74 100644 (file)
@@ -184,6 +184,7 @@ struct DIFFITEM : ListEntry
        int GetDepth() const;
        bool IsAncestor(const DIFFITEM *pdi) const;
        bool HasChildren() const;
+       void RemoveChildren();
 };
 
 #endif // _DIFF_ITEM_H_
index 5f715c7..4772a1b 100644 (file)
@@ -113,6 +113,14 @@ unsigned CDiffThread::CompareDirectories()
 
        if (m_bOnlyRequested == false)
                m_threads[0].start(DiffThreadCollect, m_pDiffParm.get());
+       else
+       {
+               int nItems = DirScan_UpdateMarkedItems(m_pDiffParm.get(), 0);
+               // Send message to UI to update
+               int event = CDiffThread::EVENT_COLLECT_COMPLETED;
+               m_pDiffParm->m_listeners.notify(m_pDiffParm.get(), event);
+               m_pDiffParm->context->m_pCompareStats->IncreaseTotalItems(nItems - m_pDiffParm->context->m_pCompareStats->GetTotalItems());
+       }
        m_threads[1].start(DiffThreadCompare, m_pDiffParm.get());
 
        return 1;
index df5f243..611b874 100644 (file)
@@ -297,7 +297,7 @@ void CDirDoc::LoadLineFilterList()
 
 void CDirDoc::DiffThreadCallback(int& state)
 {
-       PostMessage(m_pDirView->GetSafeHwnd(), MSG_UI_UPDATE, state, m_bMarkedRescan);
+       PostMessage(m_pDirView->GetSafeHwnd(), MSG_UI_UPDATE, state, false);
 }
 
 /**
@@ -320,12 +320,10 @@ void CDirDoc::Rescan()
        m_pCompareStats->Reset();
        m_pDirView->StartCompare(m_pCompareStats.get());
 
+       m_pDirView->DeleteAllDisplayItems();
        // Don't clear if only scanning selected items
        if (!m_bMarkedRescan)
-       {
-               m_pDirView->DeleteAllDisplayItems();
                m_pCtxt->RemoveAll();
-       }
 
        LoadLineFilterList();
 
@@ -346,10 +344,6 @@ void CDirDoc::Rescan()
        m_pCtxt->m_pCompareStats = m_pCompareStats.get();
        m_pCtxt->m_bRecursive = !!m_bRecursive;
 
-       // Set total items count since we don't collect items
-       if (m_bMarkedRescan)
-               m_pCompareStats->IncreaseTotalItems(m_pDirView->GetSelectedCount());
-
        pf->GetHeaderInterface()->SetPaneCount(m_nDirs);
        for (int nIndex = 0; nIndex < m_nDirs; nIndex++)
        {
index 0e152bd..be892b1 100644 (file)
@@ -688,14 +688,7 @@ int DirScan_CompareRequestedItems(DiffFuncStruct *myStruct, uintptr_t parentdiff
                else
                {
                        if (di.diffcode.isScanNeeded())
-                       {
-                               bool bItemsExist = true;
-                               UpdateDiffItem(di, bItemsExist, pCtxt);
-                               if (bItemsExist)
-                               {
-                                       CompareDiffItem(di, pCtxt);
-                               }
-                       }
+                               CompareDiffItem(di, pCtxt);
                }
                if (di.diffcode.isResultDiff() ||
                        (!existsalldirs && !di.diffcode.isResultFiltered()))
@@ -704,6 +697,71 @@ int DirScan_CompareRequestedItems(DiffFuncStruct *myStruct, uintptr_t parentdiff
        return res;
 }
 
+static int markChildrenForRescan(CDiffContext *pCtxt, uintptr_t parentdiffpos)
+{
+       int ncount = 0;
+       uintptr_t pos = pCtxt->GetFirstChildDiffPosition(parentdiffpos);
+       while (pos != NULL)
+       {
+               uintptr_t curpos = pos;
+               DIFFITEM &di = pCtxt->GetNextSiblingDiffRefPosition(pos);
+               if (di.diffcode.isDirectory())
+                       ncount += markChildrenForRescan(pCtxt, curpos);
+               else
+               {
+                       di.diffcode.diffcode |= DIFFCODE::NEEDSCAN;
+                       ++ncount;
+               }
+       }
+       return ncount;
+}
+
+int DirScan_UpdateMarkedItems(DiffFuncStruct *myStruct, uintptr_t parentdiffpos)
+{
+       CDiffContext *pCtxt = myStruct->context;
+       uintptr_t pos = pCtxt->GetFirstChildDiffPosition(parentdiffpos);
+       int ncount = 0;
+       
+       while (pos != NULL)
+       {
+               if (pCtxt->ShouldAbort())
+                       break;
+               uintptr_t curpos = pos;
+               DIFFITEM &di = pCtxt->GetNextSiblingDiffRefPosition(pos);
+               bool bItemsExist = true;
+               if (di.diffcode.isScanNeeded())
+               {
+                       UpdateDiffItem(di, bItemsExist, pCtxt);
+                       if (!bItemsExist)
+                               di.RemoveSelf();
+                       else if (!di.diffcode.isDirectory())
+                               ++ncount;
+               }
+               if (bItemsExist && di.diffcode.isDirectory() && pCtxt->m_bRecursive)
+               {
+                       if (di.diffcode.isScanNeeded() && !di.diffcode.isResultFiltered())
+                       {
+                               di.RemoveChildren();
+                               di.diffcode.diffcode &= ~DIFFCODE::NEEDSCAN;
+
+                               bool casesensitive = false;
+                               int depth = myStruct->context->m_bRecursive ? -1 : 0;
+                               String subdir[3];
+                               PathContext paths = myStruct->context->GetNormalizedPaths();
+                               for (int i = 0; i < pCtxt->GetCompareDirs(); ++i)
+                                       subdir[i] = di.diffFileInfo[i].GetFile();
+                               DirScan_GetItems(paths, subdir, myStruct,
+                                       casesensitive, depth, &di, myStruct->context->m_bWalkUniques);
+                               ncount += markChildrenForRescan(myStruct->context, curpos);
+                       }
+                       else
+                       {
+                               ncount += DirScan_UpdateMarkedItems(myStruct, curpos);
+                       }
+               }
+       }
+       return ncount;
+}
 /**
  * @brief Update diffitem file/dir infos.
  *
@@ -718,28 +776,18 @@ int DirScan_CompareRequestedItems(DiffFuncStruct *myStruct, uintptr_t parentdiff
  *  - false if items were deleted, so diffitem is not valid
  * @param [in] pCtxt Compare context
  */
-void UpdateDiffItem(DIFFITEM & di, bool & bExists, CDiffContext *pCtxt)
+static void UpdateDiffItem(DIFFITEM & di, bool & bExists, CDiffContext *pCtxt)
 {
-       // Clear side-info and file-infos
-       di.diffFileInfo[0].ClearPartial();
-       di.diffFileInfo[1].ClearPartial();
-       di.diffcode.setSideBoth(); // FIXME: DIRTY HACK for UpdateInfoFromDiskHalf
-       bool bLeftExists = pCtxt->UpdateInfoFromDiskHalf(di, 0);
-       bool bRightExists = pCtxt->UpdateInfoFromDiskHalf(di, 1);
-       bExists = bLeftExists || bRightExists;
-       if (bLeftExists)
+       bExists = false;
+       di.diffcode.setSideNone();
+       for (int i = 0; i < pCtxt->GetCompareDirs(); ++i)
        {
-               if (bRightExists)
-                       di.diffcode.setSideBoth();
-               else
-                       di.diffcode.setSideFirstOnly();
-       }
-       else
-       {
-               if (bRightExists)
-                       di.diffcode.setSideSecondOnly();
-               else
-                       di.diffcode.setSideNone();
+               di.diffFileInfo[i].ClearPartial();
+               if (pCtxt->UpdateInfoFromDiskHalf(di, i))
+               {
+                       di.diffcode.diffcode |= DIFFCODE::FIRST << i;
+                       bExists = true;
+               }
        }
 }
 
index 1084a66..32c273a 100644 (file)
@@ -21,6 +21,7 @@ struct DiffFuncStruct;
 
 int DirScan_GetItems(const PathContext &paths, const String subdir[], DiffFuncStruct *myStruct,
                bool casesensitive, int depth, DIFFITEM *parent, bool bUniques);
+int DirScan_UpdateMarkedItems(DiffFuncStruct *myStruct, uintptr_t parentdiffpos);
 
 int DirScan_CompareItems(DiffFuncStruct *, uintptr_t parentdiffpos);
 int DirScan_CompareRequestedItems(DiffFuncStruct *, uintptr_t parentdiffpos);
index 69b69e4..bda4945 100644 (file)
@@ -2886,7 +2886,6 @@ void CDirView::OnUpdateRefresh(CCmdUI* pCmdUI)
  */
 LRESULT CDirView::OnUpdateUIMessage(WPARAM wParam, LPARAM lParam)
 {
-       UNREFERENCED_PARAMETER(wParam);
        UNREFERENCED_PARAMETER(lParam);
 
        CDirDoc * pDoc = GetDocument();
@@ -2900,16 +2899,14 @@ LRESULT CDirView::OnUpdateUIMessage(WPARAM wParam, LPARAM lParam)
                m_pCmpProgressBar.reset();
 
                pDoc->CompareReady();
-               // Don't Redisplay() if triggered by OnMarkedRescan()
-               if (lParam == 0)
-               {
-                       Redisplay();
 
-                       if (GetOptionsMgr()->GetBool(OPT_SCROLL_TO_FIRST))
-                               OnFirstdiff();
-                       else
-                               MoveFocus(0, 0, 0);
-               }
+               Redisplay();
+
+               if (GetOptionsMgr()->GetBool(OPT_SCROLL_TO_FIRST))
+                       OnFirstdiff();
+               else
+                       MoveFocus(0, 0, 0);
+
                // If compare took more than TimeToSignalCompare seconds, notify user
                clock_t elapsed = clock() - m_compareStart;
                GetParentFrame()->SetMessageText(
@@ -3970,7 +3967,10 @@ void CDirView::OnMarkedRescan()
 {
        UINT items = MarkSelectedForRescan();
        if (items > 0)
+       {
+               m_pSavedTreeState.reset(SaveTreeState());
                GetDocument()->Rescan();
+       }
 }
 
 /**
index 6c68a34..f68140a 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: WinMerge\n"
 "Report-Msgid-Bugs-To: http://bugs.winmerge.org/\n"
-"POT-Creation-Date: 2015-02-13 21:36+0000\n"
+"POT-Creation-Date: 2015-02-15 15:37+0000\n"
 "PO-Revision-Date: \n"
 "Last-Translator: \n"
 "Language-Team: English <winmerge-translate@lists.sourceforge.net>\n"
index 8892cef..f333131 100644 (file)
@@ -1371,7 +1371,7 @@ msgstr "
 #: Merge.rc:683
 #, c-format
 msgid "&Refresh"
-msgstr "\91I\91ð\8d\80\96Ú\82ð\8dÅ\90V\8dX\90V(&R)"
+msgstr "\91I\91ð\8d\80\96Ú\82ð\8dÄ\94ä\8ar(&R)"
 
 #: Merge.rc:695
 #, c-format