OSDN Git Service

Merge from
authorsdottaka <sdottaka@users.sourceforge.net>
Sat, 18 Apr 2015 08:08:06 +0000 (17:08 +0900)
committersdottaka <sdottaka@users.sourceforge.net>
Sat, 18 Apr 2015 08:08:06 +0000 (17:08 +0900)
https://bitbucket.org/jtuc/winmerge2011/commits/384fa7e51f4e7a0dc424fd67da34c2810e3649fd
 (DirCompProgressDlg: Show paths of files being compared (lazily updated))
https://bitbucket.org/jtuc/winmerge2011/commits/86a84dc5dec8b4c94e65cca7431f7ad10c5528ad
 (DirCompProgressDlg: Show paths of most time-consuming one among current items)

--HG--
branch : stable

Src/CompareStats.cpp
Src/CompareStats.h
Src/DirCompProgressBar.cpp
Src/DirCompProgressBar.h
Src/DirScan.cpp
Src/DirView.cpp
Src/Merge.rc
Src/resource.h

index b5e9100..c35a9f1 100644 (file)
@@ -74,6 +74,31 @@ int CompareStats::GetTotalItems() const
        return m_nTotalItems;
 }
 
+/**\r
+* @brief Return item taking most time among current items.\r
+*/\r
+const DIFFITEM *CompareStats::GetCurDiffItem()\r
+{\r
+       int nHitCountMax = 0;\r
+       const DIFFITEM *cdi = m_rgThreadState.front().m_pDiffItem;\r
+       std::vector<ThreadState>::iterator it = m_rgThreadState.begin();\r
+       while (it != m_rgThreadState.end())\r
+       {\r
+               const DIFFITEM *di = it->m_pDiffItem;\r
+               if (di != NULL && (di->diffcode.diffcode & DIFFCODE::COMPAREFLAGS) == DIFFCODE::NOCMP)\r
+               {\r
+                       int nHitCount = it->m_nHitCount++;\r
+                       if (nHitCountMax < nHitCount)\r
+                       {\r
+                               nHitCountMax = nHitCount;\r
+                               cdi = di;\r
+                       }\r
+               }\r
+               ++it;\r
+       }\r
+       return cdi;\r
+}\r
+
 /** 
  * @brief Reset comparestats.
  * Use this function to reset stats before new compare.
index 29d0a3d..dd58498 100644 (file)
@@ -7,6 +7,10 @@
 
 #define POCO_NO_UNWINDOWS 1
 #include <Poco/Mutex.h>
+#include <Poco/AtomicCounter.h>
+#include <vector>
+
+struct DIFFITEM;
 
 /**
  * @brief Class holding directory compare stats.
@@ -65,14 +69,26 @@ public:
 
        CompareStats(int nDirs);
        ~CompareStats();
+       void SetCompareThreadCount(int nCompareThreads)
+       {
+               m_rgThreadState.resize(nCompareThreads);
+       }
+       void BeginCompare(const DIFFITEM *di, int iCompareThread)
+       {
+               ThreadState &rThreadState = m_rgThreadState[iCompareThread];
+               rThreadState.m_nHitCount = 0;
+               rThreadState.m_pDiffItem = di;
+       }
        void AddItem(int code);
        void IncreaseTotalItems(int count = 1);
        int GetCount(CompareStats::RESULT result) const;
        int GetTotalItems() const;
        int GetComparedItems() const { return m_nComparedItems; }
+       const DIFFITEM *GetCurDiffItem();
        void Reset();
        void SetCompareState(CompareStats::CMP_STATE state);
        CompareStats::CMP_STATE GetCompareState() const;
+       void SetCurrentDiffItem(const DIFFITEM *di);
        bool IsCompareDone() const { return m_bCompareDone; }
 
        CompareStats::RESULT GetResultFromCode(unsigned diffcode) const;
@@ -85,4 +101,12 @@ private:
        CMP_STATE m_state; /**< State for compare (idle, collect, compare,..) */
        bool m_bCompareDone; /**< Have we finished last compare? */
        int m_nDirs; /**< number of directories to compare */
+       struct ThreadState
+       {
+               ThreadState() : m_nHitCount(0), m_pDiffItem(NULL) {}
+               Poco::AtomicCounter m_nHitCount;
+               const DIFFITEM *m_pDiffItem;
+       };
+       std::vector<ThreadState> m_rgThreadState;
+
 };
index d93ca5a..57407b0 100644 (file)
@@ -8,6 +8,8 @@
 #include "DirCompProgressBar.h"
 #include "Merge.h"
 #include "CompareStats.h"
+#include "DiffContext.h"
+#include "paths.h"
 
 #ifdef _DEBUG
 #define new DEBUG_NEW
@@ -19,7 +21,7 @@ static char THIS_FILE[] = __FILE__;
 static const UINT IDT_UPDATE = 1;
 
 /** @brief Interval (in milliseconds) for UI updates. */
-static const UINT UPDATE_INTERVAL = 400;
+static const UINT UPDATE_INTERVAL = 600;
 
 /** @brief Reset all UI fields to zero. */
 void DirCompProgressBar::ClearStat()
@@ -39,10 +41,11 @@ void DirCompProgressBar::ClearStat()
  * @brief Constructor.
  * @param [in] pParent Parent window for progress dialog.
  */
-DirCompProgressBar::DirCompProgressBar()
+DirCompProgressBar::DirCompProgressBar(const CDiffContext& ctxt)
 : m_bCompareReady(FALSE)
 , m_prevState(CompareStats::STATE_IDLE)
 , m_pCompareStats(NULL)
+, m_ctxt(ctxt)
 #ifdef __ITaskbarList3_INTERFACE_DEFINED__
 , m_pTaskbarList(NULL)
 #endif
@@ -159,6 +162,12 @@ void DirCompProgressBar::OnTimer(UINT_PTR nIDEvent)
                                state == CompareStats::STATE_COMPARE)
                {
                        SetProgressState(m_pCompareStats->GetComparedItems(), m_pCompareStats->GetTotalItems());
+                       if (const DIFFITEM *pdi = m_pCompareStats->GetCurDiffItem())\r
+                       {\r
+                               for (int i = 0; i < m_ctxt.GetCompareDirs(); ++i)\r
+                                       GetDlgItem(IDC_PATH0_STATIC + i)->SetWindowTextW(\r
+                                               paths_ConcatPath(m_ctxt.GetPath(i), pdi->diffFileInfo[i].GetFile()).c_str());\r
+                       }\r
                }
                // Compare is ready
                // Update total items too since we might get only this one state
@@ -194,6 +203,15 @@ void DirCompProgressBar::OnSize(UINT nType, int cx, int cy)
                rectProgress.right = cx - rectProgress.left;
                pwndButton->SetWindowPos(NULL, rectButton.left, rectButton.top, 0, 0, SWP_NOZORDER|SWP_NOSIZE);
                pwndProgress->SetWindowPos(NULL, 0, 0, rectProgress.Width(), rectProgress.Height(), SWP_NOZORDER|SWP_NOMOVE);
+               for (int i = 0; i < 3; ++i)
+               {
+                       CWnd *pwndStatic = GetDlgItem(IDC_PATH0_STATIC + i);
+                       CRect rectStatic;
+                       pwndStatic->GetWindowRect(&rectStatic);
+                       ScreenToClient(&rectStatic);
+                       rectStatic.right = rectButton.left - 4;
+                       pwndStatic->SetWindowPos(NULL, 0, 0, rectStatic.Width(), rectStatic.Height(), SWP_NOZORDER|SWP_NOMOVE);
+               }
        }
 }
 
index d420815..603562f 100644 (file)
@@ -8,6 +8,7 @@
 #include "CompareStats.h"
 
 class ITaskBarList3;
+class CDiffContext;
 
 /////////////////////////////////////////////////////////////////////////////
 // DirCompProgressBar dialog
@@ -34,7 +35,7 @@ class DirCompProgressBar : public CDialogBar
 {
 // Construction
 public:
-       DirCompProgressBar();   // standard constructor
+       DirCompProgressBar(const CDiffContext& ctxt);   // standard constructor
        ~DirCompProgressBar();
        BOOL Create(CWnd* pParentWnd);
        void SetCompareStat(CompareStats * pCompareStats);
@@ -65,6 +66,7 @@ private:
 #ifdef __ITaskbarList3_INTERFACE_DEFINED__
        ITaskbarList3 *m_pTaskbarList;
 #endif
+       const CDiffContext& m_ctxt;
 };
 
 //{{AFX_INSERT_LOCATION}}
index 097f588..b3ee46e 100644 (file)
@@ -78,8 +78,8 @@ private:
 class DiffWorker: public Runnable
 {
 public:
-       DiffWorker(NotificationQueue& queue, CDiffContext *pCtxt):
-         m_queue(queue), m_pCtxt(pCtxt) {}
+       DiffWorker(NotificationQueue& queue, CDiffContext *pCtxt, int id):
+         m_queue(queue), m_pCtxt(pCtxt), m_id(id) {}
 
        void run()
        {
@@ -92,6 +92,7 @@ public:
                {
                        WorkNotification* pWorkNf = dynamic_cast<WorkNotification*>(pNf.get());
                        if (pWorkNf) {
+                               m_pCtxt->m_pCompareStats->BeginCompare(&pWorkNf->data(), m_id);
                                if (!m_pCtxt->ShouldAbort())
                                        CompareDiffItem(pWorkNf->data(), m_pCtxt);
                                pWorkNf->queueResult().enqueueNotification(new WorkCompletedNotification(pWorkNf->data()));
@@ -103,6 +104,7 @@ public:
 private:
        NotificationQueue& m_queue;
        CDiffContext *m_pCtxt;
+       int m_id;
 };
 
 typedef std::shared_ptr<DiffWorker> DiffWorkerPtr;
@@ -558,9 +560,10 @@ int DirScan_CompareItems(DiffFuncStruct *myStruct, uintptr_t parentdiffpos)
        size_t nworkers = (compareMethod == CMP_CONTENT || compareMethod == CMP_QUICK_CONTENT) ? Environment::processorCount() : 1;
        NotificationQueue queue;
 
+       myStruct->context->m_pCompareStats->SetCompareThreadCount(nworkers);
        for (size_t i = 0; i < nworkers; ++i)
        {
-               workers.push_back(DiffWorkerPtr(new DiffWorker(queue, myStruct->context)));
+               workers.push_back(DiffWorkerPtr(new DiffWorker(queue, myStruct->context, i)));
                threadPool.start(*workers[i]);
        }
 
index 4fb8c97..38818ba 100644 (file)
@@ -470,7 +470,7 @@ int CDirView::GetDefaultColImage() const
 void CDirView::StartCompare(CompareStats *pCompareStats)
 {
        if (m_pCmpProgressBar == NULL)
-               m_pCmpProgressBar.reset(new DirCompProgressBar());
+               m_pCmpProgressBar.reset(new DirCompProgressBar(GetDocument()->GetDiffContext()));
 
        if (!::IsWindow(m_pCmpProgressBar->GetSafeHwnd()))
                m_pCmpProgressBar->Create(GetParentFrame());
index 4a58a88..a73d48a 100644 (file)
@@ -1322,18 +1322,21 @@ BEGIN
                     ES_READONLY
 END
 
-IDD_DIRCOMP_PROGRESS DIALOGEX 0, 0, 256, 60
+IDD_DIRCOMP_PROGRESS DIALOGEX 0, 0, 256, 64
 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD 
 FONT 8, "MS Shell Dlg", 0, 0, 0x1
 BEGIN
     DEFPUSHBUTTON   "Stop",IDC_COMPARISON_STOP,167,15,83,14
-    CONTROL         "",IDC_PROGRESSCOMPARE,"msctls_progress32",WS_BORDER,9,
-                    44,241,9
+    CONTROL         "",IDC_PROGRESSCOMPARE,"msctls_progress32",WS_BORDER,7,
+                    49,241,9
     RTEXT           "0",IDC_ITEMSCOMPARED,95,29,30,9
     RTEXT           "0",IDC_ITEMSTOTAL,95,19,30,9
     LTEXT           "Comparing items...",IDC_STATIC,7,7,150,9
     LTEXT           "Items compared:",IDC_STATIC,7,29,85,9
     LTEXT           "Items total:",IDC_STATIC,7,19,85,9
+       LTEXT           "", IDC_PATH0_STATIC, 137, 19, 242, 9\r
+       LTEXT           "", IDC_PATH1_STATIC, 137, 29, 242, 9\r
+       LTEXT           "", IDC_PATH2_STATIC, 137, 39, 242, 9
 END
 
 IDD_WMGOTO DIALOGEX 0, 0, 210, 80
index 62f51d0..2943d88 100644 (file)
 #define IDC_SWAP02_BUTTON               1354
 #define IDC_COLORSCHEME_GITHUBBITBUCKET 1355
 #define IDC_FINDDLG_DONTCLOSE           1356
+#define IDC_PATH0_STATIC                1357
+#define IDC_PATH1_STATIC                1358
+#define IDC_PATH2_STATIC                1359
 #define IDC_EDIT_WHOLE_WORD             8603
 #define IDC_EDIT_MATCH_CASE             8604
 #define IDC_EDIT_FINDTEXT               8605
 #define _APS_3D_CONTROLS                     1
 #define _APS_NEXT_RESOURCE_VALUE        242
 #define _APS_NEXT_COMMAND_VALUE         33273
-#define _APS_NEXT_CONTROL_VALUE         1358
+#define _APS_NEXT_CONTROL_VALUE         1361
 #define _APS_NEXT_SYMED_VALUE           115
 #endif
 #endif